1 /* This test is designed to test the simple dpump host/device class operation. */
2
3 #include <stdio.h>
4 #include "tx_api.h"
5 #include "fx_api.h"
6 #include "ux_api.h"
7 #include "ux_system.h"
8 #include "ux_utility.h"
9
10 #include "ux_device_class_pima.h"
11 #include "ux_host_class_pima.h"
12
13 #include "ux_hcd_sim_host.h"
14 #include "ux_device_stack.h"
15
16 #include "ux_test_dcd_sim_slave.h"
17 #include "ux_test_hcd_sim_host.h"
18 #include "ux_test_utility_sim.h"
19
20
21 /* Define constants. */
22 #define UX_TEST_STACK_SIZE (2*1024)
23 #define UX_TEST_MEMORY_SIZE (512*1024)
24
25 #define UX_TEST_RAM_DISK_SIZE (128*1024)
26 #define UX_TEST_RAM_DISK_LAST_LBA ((UX_TEST_RAM_DISK_SIZE / 512) - 1)
27
28 #define UX_TEST_MAX_HANDLES 16
29 #define UX_TEST_MAX_DATASET_HEADER 32
30 #define UX_TEST_MAX_DATASET_SIZE 1024
31 #define UX_TEST_PIMA_STORAGE_ID 1
32 #define UX_TEST_VENDOR_REQUEST 0x54
33
34 #define UX_TEST_CUSTOM_VID 0x0000
35 #define UX_TEST_CUSTOM_PID 0x0000
36
37 #define UX_TEST_AUDIO_CODEC_WAVE_FORMAT_MPEGLAYER3 0x00000055
38 #define UX_TEST_AUDIO_CODEC_WAVE_FORMAT_MPEG 0x00000050
39 #define UX_TEST_AUDIO_CODEC_WAVE_FORMAT_RAW_AAC1 0x000000FF
40
41
42 /* Define local/extern function prototypes. */
43
44 extern VOID _fx_ram_driver(FX_MEDIA *media_ptr);
45
46 static void test_thread_entry(ULONG);
47
48 static TX_THREAD test_thread_host_simulation;
49 static TX_THREAD test_thread_device_simulation;
50 static void test_thread_host_simulation_entry(ULONG);
51 static void test_thread_device_simulation_entry(ULONG);
52
53 static VOID test_hcd_entry_set_cfg(UX_TEST_ACTION *action, VOID *params);
54 static VOID test_hcd_entry_interaction_request_sem_put(UX_TEST_ACTION *action, VOID *params);
55 static VOID test_hcd_entry_interaction_invoked(UX_TEST_ACTION *action, VOID *params);
56 static VOID test_hcd_entry_interaction_wait_transfer_disconnection(UX_TEST_ACTION *action, VOID *params);
57
58 static VOID test_pima_instance_activate(VOID *pima_instance);
59 static VOID test_pima_instance_deactivate(VOID *pima_instance);
60
61 UINT pima_device_device_reset();
62 UINT pima_device_device_prop_desc_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
63 ULONG device_property,
64 UCHAR **device_prop_dataset,
65 ULONG *device_prop_dataset_length);
66 UINT pima_device_device_prop_value_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
67 ULONG device_property,
68 UCHAR **device_prop_value,
69 ULONG *device_prop_value_length);
70 UINT pima_device_device_prop_value_set(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
71 ULONG device_property,
72 UCHAR *device_prop_value,
73 ULONG device_prop_value_length);
74 UINT pima_device_storage_format(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
75 ULONG storage_id);
76 UINT pima_device_storage_info_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
77 ULONG storage_id);
78 UINT pima_device_object_number_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
79 ULONG object_format_code,
80 ULONG object_association,
81 ULONG *object_number);
82 UINT pima_device_object_handles_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
83 ULONG object_handles_format_code,
84 ULONG object_handles_association,
85 ULONG *object_handles_array,
86 ULONG object_handles_max_number);
87 UINT pima_device_object_info_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
88 ULONG object_handle,
89 UX_SLAVE_CLASS_PIMA_OBJECT **object);
90 UINT pima_device_object_data_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
91 ULONG object_handle,
92 UCHAR *object_buffer,
93 ULONG object_offset,
94 ULONG object_length_requested,
95 ULONG *object_actual_length);
96 UINT pima_device_object_info_send (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
97 UX_SLAVE_CLASS_PIMA_OBJECT *object,
98 ULONG storage_id,
99 ULONG parent_object_handle,
100 ULONG *object_handle);
101 UINT pima_device_object_data_send (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
102 ULONG object_handle,
103 ULONG phase ,
104 UCHAR *object_buffer,
105 ULONG object_offset,
106 ULONG object_length);
107 UINT pima_device_object_delete(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
108 ULONG object_handle);
109 UINT pima_device_object_prop_desc_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
110 ULONG object_property,
111 ULONG object_format_code,
112 UCHAR **object_prop_dataset,
113 ULONG *object_prop_dataset_length);
114 UINT pima_device_object_prop_value_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
115 ULONG object_handle,
116 ULONG object_property,
117 UCHAR **object_prop_value,
118 ULONG *object_prop_value_length);
119 UINT pima_device_object_prop_value_set (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
120 ULONG object_handle,
121 ULONG object_property,
122 UCHAR *object_prop_value,
123 ULONG object_prop_value_length);
124 UINT pima_device_object_references_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
125 ULONG object_handle,
126 UCHAR **object_references_array,
127 ULONG *object_references_array_length);
128 UINT pima_device_object_references_set (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
129 ULONG object_handle,
130 UCHAR *object_references_array,
131 ULONG object_references_array_length);
132 UINT pima_device_object_handle_check(ULONG object_handle,
133 UX_SLAVE_CLASS_PIMA_OBJECT **object,
134 ULONG *caller_handle_index);
135 UINT pima_device_device_class_custom_entry(UX_SLAVE_CLASS_COMMAND *command);
136 UINT pima_device_vendor_request(ULONG request, ULONG request_value, ULONG request_index, ULONG request_length,
137 UCHAR *transfer_request_buffer,
138 ULONG *transfer_request_length);
139
140
141 /* Define global data structures. */
142 static UCHAR usbx_memory[UX_TEST_MEMORY_SIZE + (UX_TEST_STACK_SIZE * 2)];
143
144 static UX_SLAVE_CLASS_PIMA_DEVICE *pima_device;
145 static UX_SLAVE_CLASS_PIMA_PARAMETER pima_device_parameter;
146
147 static UX_HOST_CLASS_PIMA *pima_host;
148 static UX_HOST_CLASS_PIMA_SESSION pima_host_session;
149 static UX_HOST_CLASS_PIMA_DEVICE pima_host_device;
150 static UX_HOST_CLASS_PIMA_OBJECT pima_host_object;
151
152 static ULONG host_buffer[4096];
153 static UCHAR *host_buffer8 = (UCHAR *)host_buffer;
154 static USHORT *host_buffer16 = (USHORT *)host_buffer;
155 static ULONG *host_buffer32 = (ULONG *)host_buffer;
156
157 static FX_MEDIA ram_disk;
158 static CHAR ram_disk_memory[UX_TEST_RAM_DISK_SIZE];
159 static CHAR ram_disk_buffer[2048];
160
161
162 static ULONG error_counter;
163
164 static ULONG set_cfg_counter;
165
166 static ULONG rsc_mem_free_on_set_cfg;
167 static ULONG rsc_sem_on_set_cfg;
168 static ULONG rsc_sem_get_on_set_cfg;
169 static ULONG rsc_mutex_on_set_cfg;
170
171 static ULONG rsc_enum_sem_usage;
172 static ULONG rsc_enum_sem_get_count;
173 static ULONG rsc_enum_mutex_usage;
174 static ULONG rsc_enum_mem_usage;
175
176 static ULONG rsc_cdc_sem_usage;
177 static ULONG rsc_cdc_sem_get_count;
178 static ULONG rsc_cdc_mutex_usage;
179 static ULONG rsc_cdc_mem_usage;
180
181 static ULONG interaction_count;
182
183 static UCHAR error_callback_ignore = UX_TRUE;
184 static ULONG error_callback_counter;
185
186
187 /* Structure of the Object property dataset. This is specific to the local device. */
188 typedef struct TEST_PIMA_OBJECT_PROP_DATASET_STRUCT
189 {
190 ULONG test_pima_object_prop_dataset_storage_id;
191 ULONG test_pima_object_prop_dataset_object_format;
192 ULONG test_pima_object_prop_dataset_protection_status;
193 ULONG test_pima_object_prop_dataset_object_size_low;
194 ULONG test_pima_object_prop_dataset_object_size_high;
195 UCHAR test_pima_object_prop_dataset_object_file_name[128];
196 ULONG test_pima_object_prop_dataset_parent_object;
197 ULONG test_pima_object_prop_dataset_persistent_unique_object_identifier[4];
198 UCHAR test_pima_object_prop_dataset_name[128];
199 UCHAR test_pima_object_prop_dataset_non_consumable;
200 UCHAR test_pima_object_prop_dataset_artist[128];
201 ULONG test_pima_object_prop_dataset_track;
202 ULONG test_pima_object_prop_dataset_use_count;
203 UCHAR test_pima_object_prop_dataset_date_authored[16];
204 UCHAR test_pima_object_prop_dataset_genre[128];
205 UCHAR test_pima_object_prop_dataset_album_name[128];
206 UCHAR test_pima_object_prop_dataset_album_artist[128];
207 ULONG test_pima_object_prop_dataset_sample_rate;
208 ULONG test_pima_object_prop_dataset_number_of_channels;
209 ULONG test_pima_object_prop_dataset_audio_wave_codec;
210 ULONG test_pima_object_prop_dataset_audio_bitrate;
211 ULONG test_pima_object_prop_dataset_duration;
212 ULONG test_pima_object_prop_dataset_width;
213 ULONG test_pima_object_prop_dataset_height;
214 ULONG test_pima_object_prop_dataset_scan_type;
215 ULONG test_pima_object_prop_dataset_fourcc_codec;
216 ULONG test_pima_object_prop_dataset_video_bitrate;
217 ULONG test_pima_object_prop_dataset_frames_per_thousand_seconds;
218 ULONG test_pima_object_prop_dataset_keyframe_distance;
219 UCHAR test_pima_object_prop_dataset_encoding_profile[128];
220
221 } TEST_PIMA_PROP_DATASET;
222
223
224 /* Define device framework. */
225
226 UCHAR device_framework_full_speed[] = {
227
228 /* Device descriptor */
229 0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08,
230 0xE8, 0x04, 0xC5, 0x68, 0x00, 0x00, 0x01, 0x02,
231 0x03, 0x01,
232
233 /* Configuration descriptor */
234 0x09, 0x02, 0x27, 0x00, 0x01, 0x01, 0x00, 0xc0,
235 0x32,
236
237 /* Interface descriptor */
238 0x09, 0x04, 0x00, 0x00, 0x03, 0x06, 0x01, 0x01,
239 0x00,
240
241 /* Endpoint descriptor (Bulk In) */
242 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00,
243
244 /* Endpoint descriptor (Bulk Out) */
245 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00,
246
247 /* Endpoint descriptor (Interrupt In) */
248 0x07, 0x05, 0x83, 0x03, 0x40, 0x00, 0x04
249 };
250 #define DEVICE_FRAMEWORK_LENGTH_FULL_SPEED sizeof(device_framework_full_speed)
251
252 UCHAR device_framework_high_speed[] = {
253
254 /* Device descriptor */
255 0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40,
256 0xE8, 0x04, 0xC5, 0x68, 0x01, 0x00, 0x01, 0x02,
257 0x03, 0x01,
258
259 /* Device qualifier descriptor */
260 0x0a, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40,
261 0x01, 0x00,
262
263 /* Configuration descriptor */
264 0x09, 0x02, 0x27, 0x00, 0x01, 0x01, 0x00, 0xc0,
265 0x32,
266
267 /* Interface descriptor */
268 0x09, 0x04, 0x00, 0x00, 0x03, 0x06, 0x01, 0x01,
269 0x00,
270
271 /* Endpoint descriptor (Bulk In) */
272 0x07, 0x05, 0x81, 0x02, 0x00, 0x02, 0x00,
273
274 /* Endpoint descriptor (Bulk Out) */
275 0x07, 0x05, 0x02, 0x02, 0x00, 0x02, 0x00,
276
277 /* Endpoint descriptor (Interrupt In) */
278 0x07, 0x05, 0x83, 0x03, 0x40, 0x00, 0x04
279 };
280 #define DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED sizeof(device_framework_high_speed)
281
282 /* String Device Framework :
283 Byte 0 and 1 : Word containing the language ID : 0x0904 for US or 0x0000 for none.
284 Byte 2 : Byte containing the index of the descriptor
285 Byte 3 : Byte containing the length of the descriptor string
286
287 The last string entry can be the optional Microsoft String descriptor.
288 */
289 UCHAR string_framework[] = {
290
291 /* Manufacturer string descriptor : Index 1 */
292 0x09, 0x04, 0x01, 0x0c,
293 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x20, 0x4c,
294 0x6f, 0x67, 0x69, 0x63,
295
296 /* Product string descriptor : Index 2 */
297 0x09, 0x04, 0x02, 0x0a,
298 0x4d, 0x54, 0x50, 0x20, 0x70, 0x6c, 0x61, 0x79,
299 0x65, 0x72,
300
301 /* Serial Number string descriptor : Index 3 */
302 0x09, 0x04, 0x03, 0x04,
303 0x30, 0x30, 0x30, 0x31,
304
305 /* Microsoft OS string descriptor : Index 0xEE. String is MSFT100.
306 The last byte is the vendor code used to filter Vendor specific commands.
307 The vendor commands will be executed in the class.
308 This code can be anything but must not be 0x66 or 0x67 which are PIMA class commands. */
309 0x00, 0x00, 0xEE, 0x08,
310 0x4D, 0x53, 0x46, 0x54,
311 0x31, 0x30, 0x30,
312 UX_TEST_VENDOR_REQUEST
313
314 };
315 #define STRING_FRAMEWORK_LENGTH sizeof(string_framework)
316
317 /* Multiple languages are supported on the device, to add
318 a language besides english, the unicode language code must
319 be appended to the language_id_framework array and the length
320 adjusted accordingly. */
321 UCHAR language_id_framework[] = {
322
323 /* English. */
324 0x09, 0x04
325 };
326 #define LANGUAGE_ID_FRAMEWORK_LENGTH sizeof(language_id_framework)
327
328
329 /* Define PIMA supported device properties. The last entry MUST be a zero. The DeviceInfoSet command
330 will parse this array and compute the number of functions supported and return it to the
331 host. For each declared device property, a dataset must be created in the application. */
332 USHORT pima_device_prop_supported[] = {
333
334 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_UNDEFINED, */
335 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_BATTERY_LEVEL, */
336 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_FUNCTIONALMODE, */
337 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_IMAGE_SIZE, */
338 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_COMPRESSION_SETTING, */
339 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_WHITE_BALANCE, */
340 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_RGB_GAIN, */
341 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_F_NUMBER, */
342 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_FOCAL_LENGTH, */
343 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_FOCUS_DISTANCE, */
344 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_FOCUS_MODE, */
345 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_METERING_MODE, */
346 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_FLASH_MODE, */
347 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_TIME, */
348 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_PROGRAM_MODE, */
349 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_INDEX, */
350 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_EXPOSURE_BIAS_COMPENSATION, */
351 UX_DEVICE_CLASS_PIMA_DEV_PROP_DATE_TIME,
352 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_CAPTURE_DELAY, */
353 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_STILL_CAPTURE_MODE, */
354 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_CONTRAST, */
355 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_SHARPNESS, */
356 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_DIGITAL_ZOOM, */
357 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_EFFECT_MODE, */
358 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_BURST_NUMBER, */
359 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_BURST_INTERVAL, */
360 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_TIME_LAPSE_NUMBER, */
361 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_TIME_LAPSE_INTERVAL, */
362 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_FOCUS_METERING_MODE, */
363 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_UPLOAD_URL, */
364 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_ARTIST, */
365 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_COPYRIGHT_INFO, */
366 #ifdef UX_PIMA_WITH_MTP_SUPPORT
367 UX_DEVICE_CLASS_PIMA_DEV_PROP_SYNCHRONIZATION_PARTNER,
368 UX_DEVICE_CLASS_PIMA_DEV_PROP_DEVICE_FRIENDLY_NAME,
369 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_VOLUME, */
370 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_SUPPORTED_FORMATS_ORDERED, */
371 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_DEVICE_ICON, */
372 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_PLAYBACK_RATE, */
373 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_PLAYBACK_OBJECT, */
374 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_PLAYBACK_CONTAINER, */
375 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_SESSION_INITIATOR_VERSION_INFO, */
376 /*UX_DEVICE_CLASS_PIMA_DEV_PROP_PERCEIVED_DEVICE_TYPE, */
377 #endif
378 0
379 };
380
381 /* Define PIMA supported capture formats. The last entry MUST be a zero. The DeviceInfoSet command
382 will parse this array and compute the number of functions supported and return it to the
383 host. */
384 USHORT pima_device_supported_capture_formats[] = {
385 0
386 };
387
388 /* Define PIMA supported image formats. The last entry MUST be a zero. The DeviceInfoSet command
389 will parse this array and compute the number of formats supported and return it to the
390 host. */
391 USHORT pima_device_supported_image_formats[] = {
392 UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED,
393 UX_DEVICE_CLASS_PIMA_OFC_ASSOCIATION,
394 /*UX_DEVICE_CLASS_PIMA_OFC_SCRIPT, */
395 /*UX_DEVICE_CLASS_PIMA_OFC_EXECUTABLE, */
396 /*UX_DEVICE_CLASS_PIMA_OFC_TEXT, */
397 /*UX_DEVICE_CLASS_PIMA_OFC_HTML, */
398 /*UX_DEVICE_CLASS_PIMA_OFC_DPOF, */
399 /*UX_DEVICE_CLASS_PIMA_OFC_AIFF, */
400 /*UX_DEVICE_CLASS_PIMA_OFC_WAV,*/
401 UX_DEVICE_CLASS_PIMA_OFC_MP3,
402 /*UX_DEVICE_CLASS_PIMA_OFC_AVI, */
403 /*UX_DEVICE_CLASS_PIMA_OFC_MPEG, */
404 UX_DEVICE_CLASS_PIMA_OFC_ASF,
405 /*UX_DEVICE_CLASS_PIMA_OFC_DEFINED, */
406 /*UX_DEVICE_CLASS_PIMA_OFC_EXIF_JPEG, */
407 /*UX_DEVICE_CLASS_PIMA_OFC_TIFF_EP, */
408 /*UX_DEVICE_CLASS_PIMA_OFC_FLASHPIX, */
409 /*UX_DEVICE_CLASS_PIMA_OFC_BMP, */
410 /*UX_DEVICE_CLASS_PIMA_OFC_CIFF, */
411 /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED, */
412 /*UX_DEVICE_CLASS_PIMA_OFC_GIF, */
413 /*UX_DEVICE_CLASS_PIMA_OFC_JFIF, */
414 /*UX_DEVICE_CLASS_PIMA_OFC_CD, */
415 /*UX_DEVICE_CLASS_PIMA_OFC_PICT, */
416 /*UX_DEVICE_CLASS_PIMA_OFC_PNG, */
417 /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED, */
418 /*UX_DEVICE_CLASS_PIMA_OFC_TIFF, */
419 /*UX_DEVICE_CLASS_PIMA_OFC_TIFF_IT, */
420 /*UX_DEVICE_CLASS_PIMA_OFC_JP2, */
421 /*UX_DEVICE_CLASS_PIMA_OFC_JPX, */
422 #ifdef UX_PIMA_WITH_MTP_SUPPORT
423 /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_FIRMWARE, */
424 /*UX_DEVICE_CLASS_PIMA_OFC_WINDOWS_IMAGE_FORMAT, */
425 /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_AUDIO, */
426 UX_DEVICE_CLASS_PIMA_OFC_WMA,
427 /*UX_DEVICE_CLASS_PIMA_OFC_OGG, */
428 /*UX_DEVICE_CLASS_PIMA_OFC_AAC, */
429 /*UX_DEVICE_CLASS_PIMA_OFC_AUDIBLE, */
430 /*UX_DEVICE_CLASS_PIMA_OFC_FLAC, */
431 /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_VIDEO, */
432 UX_DEVICE_CLASS_PIMA_OFC_WMV,
433 /*UX_DEVICE_CLASS_PIMA_OFC_MP4_CONTAINER, */
434 /*UX_DEVICE_CLASS_PIMA_OFC_MP2, */
435 /*UX_DEVICE_CLASS_PIMA_OFC_3GP_CONTAINER, */
436 /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_COLLECTION, */
437 /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_MULTIMEDIA_ALBUM, */
438 /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_IMAGE_ALBUM, */
439 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_ALBUM,
440 /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_VIDEO_ALBUM, */
441 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_AND_VIDEO_PLAYLIST,
442 /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_CONTACT_GROUP, */
443 /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_MESSAGE_FOLDER, */
444 /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_CHAPTERED_PRODUCTION, */
445 /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_PLAYLIST, */
446 /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_VIDEO_PLAYLIST, */
447 /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_MEDIACAST, */
448 /*UX_DEVICE_CLASS_PIMA_OFC_WPL_PLAYLIST, */
449 /*UX_DEVICE_CLASS_PIMA_OFC_M3U_PLAYLIST, */
450 /*UX_DEVICE_CLASS_PIMA_OFC_MPL_PLAYLIST, */
451 /*UX_DEVICE_CLASS_PIMA_OFC_ASX_PLAYLIST, */
452 /*UX_DEVICE_CLASS_PIMA_OFC_PLS_PLAYLIST, */
453 /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_DOCUMENT, */
454 /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_DOCUMENT, */
455 /*UX_DEVICE_CLASS_PIMA_OFC_XML_DOCUMENT, */
456 /*UX_DEVICE_CLASS_PIMA_OFC_MICROSOFT_WORD_DOCUMENT, */
457 /*UX_DEVICE_CLASS_PIMA_OFC_MHT_COMPILED_HTML_DOCUMENT, */
458 /*UX_DEVICE_CLASS_PIMA_OFC_MICROSOFT_EXCEL_SPREADSHEET, */
459 /*UX_DEVICE_CLASS_PIMA_OFC_MICROSOFT_POWERPOINT_PRESENTATION, */
460 /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_MESSAGE, */
461 /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_MESSAGE, */
462 /*UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED_CONTACT, */
463 /*UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_CONTACT, */
464 /*UX_DEVICE_CLASS_PIMA_OFC_VCARD2, */
465 #endif
466 0
467 };
468
469 /* Device property dataset. Here we give the example of the Date/Time dataset. */
470 UCHAR pima_device_prop_date_time_dataset[] = {
471
472 /* Device prop code : Date/Time. */
473 0x11, 0x50, /* Prop code */
474 0xff, 0xff, /* String */
475 0x01, /* GET/SET */
476 0x00, /* Default value : empty string. */
477 0x10, /* Current value : length of the unicode string. */
478 0x31, 0x00, 0x39, 0x00, 0x38, 0x00, 0x30, 0x00, /* YYYY */
479 0x30, 0x00, 0x31, 0x00, /* MM */
480 0x30, 0x00, 0x31, 0x00, /* DD */
481 0x54, 0x00, /* T */
482 0x30, 0x00, 0x30, 0x00, /* HH */
483 0x30, 0x00, 0x30, 0x00, /* MM */
484 0x30, 0x00, 0x30, 0x00, /* SS */
485 0x00, 0x00, /* Unicode terminator. */
486 0x00 /* Form Flag : None. */
487 };
488 #define DEVICE_PROP_DATE_TIME_DATASET_LENGTH sizeof(pima_device_prop_date_time_dataset) /* 40 */
489
490 /* Device property dataset. Here we give the example of the synchronization partner dataset. */
491 UCHAR pima_device_prop_synchronization_partner_dataset[] = {
492
493 /* Device prop code : Synchronization Partner. */
494 0x01, 0xD4, /* Prop code */
495 0xff, 0xff, /* String */
496 0x01, /* GET/SET */
497 0x00, /* Default value : empty string. */
498 0x00, /* Current value : empty string. */
499 0x00 /* Form Flag : None. */
500 };
501 #define DEVICE_PROP_SYNCHRONIZATION_PARTNER_DATASET_LENGTH sizeof(pima_device_prop_synchronization_partner_dataset) /* 8 */
502
503 /* Device property dataset. Here we give the example of the device friendly name dataset. */
504 UCHAR pima_device_prop_device_friendly_name_dataset[] = {
505
506 /* Device prop code : Device Friendly Name. */
507 0x02, 0xD4, /* Prop code */
508 0xff, 0xff, /* String */
509 0x01, /* GET/SET */
510 0x0E, /* Default value. Length of Unicode string. */
511 0x45, 0x00, 0x4C, 0x00, 0x20, 0x00, 0x4D, 0x00, /* Unicode string. */
512 0x54, 0x00, 0x50, 0x00, 0x20, 0x00, 0x44, 0x00,
513 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00,
514 0x65, 0x00,
515 0x00, 0x00, /* Unicode terminator. */
516 0x0E, /* Current value. Length of Unicode string. */
517 0x45, 0x00, 0x4C, 0x00, 0x20, 0x00, 0x4D, 0x00,
518 0x54, 0x00, 0x50, 0x00, 0x20, 0x00, 0x44, 0x00,
519 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, /* Unicode terminator. */
520 0x65, 0x00,
521 0x00, 0x00, /* Unicode terminator. */
522 0x00 /* Form Flag : None. */
523 };
524 #define DEVICE_PROP_DEVICE_FRIENDLY_NAME_DATASET_LENGTH sizeof(pima_device_prop_device_friendly_name_dataset) /* 64 */
525
526 /* Object property supported.
527 WORD 0 : Object Format Code
528 WORD 1 : Number of Prop codes for this Object format
529 WORD n : Prop Codes
530 WORD n+2 : Next Object Format code ....
531
532 This array is in whatever endinaness of the system and will be translated
533 by the PTP class in little endian.
534
535 */
536 USHORT pima_device_object_prop_supported[] = {
537
538 /* Object format code : Undefined. */
539 UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED,
540
541 /* NUmber of objects supported for this format. */
542 9,
543 /* Mandatory objects for all formats. */
544 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID,
545 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT,
546 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS,
547 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE,
548 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME,
549 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT,
550 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER,
551 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME,
552 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE,
553
554 /* Object format code : Association. */
555 UX_DEVICE_CLASS_PIMA_OFC_ASSOCIATION,
556
557 /* NUmber of objects supported for this format. */
558 9,
559 /* Mandatory objects for all formats. */
560 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID,
561 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT,
562 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS,
563 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE,
564 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME,
565 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT,
566 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER,
567 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME,
568 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE,
569
570 /* Object format code : Advanced System Format. */
571 UX_DEVICE_CLASS_PIMA_OFC_ASF,
572
573 /* NUmber of objects supported for this format. */
574 9,
575 /* Mandatory objects for all formats. */
576 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID,
577 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT,
578 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS,
579 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE,
580 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME,
581 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT,
582 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER,
583 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME,
584 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE,
585
586 /* Object format code : Audio Clip. */
587 UX_DEVICE_CLASS_PIMA_OFC_MP3,
588
589 /* NUmber of objects supported for this format. */
590 20,
591 /* Mandatory objects for all formats. */
592 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID,
593 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT,
594 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS,
595 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE,
596 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME,
597 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT,
598 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER,
599 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME,
600 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE,
601
602 /* Mandatory objects for all audio objects. */
603 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ARTIST,
604 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_TRACK,
605 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED,
606 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE,
607 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_USE_COUNT,
608 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_NAME,
609 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST,
610 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SAMPLE_RATE,
611 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NUMBER_OF_CHANNELS,
612 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_WAVE_CODEC,
613 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_BITRATE,
614
615 /* Object format code : Windows Media Audio Clip. */
616 UX_DEVICE_CLASS_PIMA_OFC_WMA,
617
618 /* NUmber of objects supported for this format. */
619 20,
620 /* Mandatory objects for all formats. */
621 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID,
622 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT,
623 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS,
624 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE,
625 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME,
626 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT,
627 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER,
628 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME,
629 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE,
630
631 /* Mandatory objects for all audio objects. */
632 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ARTIST,
633 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_TRACK,
634 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED,
635 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE,
636 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_USE_COUNT,
637 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_NAME,
638 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST,
639 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SAMPLE_RATE,
640 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NUMBER_OF_CHANNELS,
641 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_WAVE_CODEC,
642 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_BITRATE,
643
644 /* Object format code : Windows Media Video. */
645 UX_DEVICE_CLASS_PIMA_OFC_WMV,
646
647 /* NUmber of objects supported for this format. */
648 24,
649 /* Mandatory objects for all formats. */
650 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID,
651 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT,
652 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS,
653 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE,
654 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME,
655 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT,
656 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER,
657 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME,
658 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE,
659
660 /* Mandatory objects for all video objects. */
661 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_WIDTH,
662 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_HEIGHT,
663 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED,
664 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE,
665 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_USE_COUNT,
666 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SAMPLE_RATE,
667 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NUMBER_OF_CHANNELS,
668 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SCAN_TYPE,
669 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_WAVE_CODEC,
670 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_BITRATE,
671 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_FOURCC_CODEC,
672 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_BITRATE,
673 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_FRAMES_PER_THOUSAND_SECONDS,
674 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_KEYFRAME_DISTANCE,
675 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ENCODING_PROFILE,
676
677 /* Object format code : Abstract Audio Album. */
678 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_ALBUM,
679 2,
680 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE,
681 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST,
682
683 /* Object format code : Abstract Audio and Video Playlist. */
684 UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_AND_VIDEO_PLAYLIST,
685 2,
686 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE,
687 UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST,
688
689 0
690 };
691
692 /* PIMA MTP names ... */
693 UCHAR pima_device_info_vendor_name[] = "Microsoft AzureRTOS";
694 UCHAR pima_device_info_product_name[] = "AzureRTOS MTP Device";
695 UCHAR pima_device_info_serial_no[] = "1.1.1.1";
696 UCHAR pima_device_info_version[] = "V1.0";
697
698 /* PIMA MTP storage names. */
699 UCHAR pima_parameter_volume_description[] = "MTP Client Storage Volume";
700 UCHAR pima_parameter_volume_label[] = "MTP Client Storage Label";
701
702 /* Array of handles for the demo. */
703 ULONG pima_device_object_number_handles;
704 ULONG pima_device_object_number_handles_array[UX_TEST_MAX_HANDLES];
705 UX_SLAVE_CLASS_PIMA_OBJECT pima_device_object_info_array[UX_TEST_MAX_HANDLES];
706 FX_FILE pima_device_object_filex_array[UX_TEST_MAX_HANDLES];
707 TEST_PIMA_PROP_DATASET pima_device_object_property_array[UX_TEST_MAX_HANDLES];
708
709 /* Local storage for one Object property. This is a temporary storage to create
710 the demanded dataset. The size of the dataset depends on the type and number of object properties. */
711 UCHAR pima_device_object_property_dataset_data_buffer [UX_TEST_MAX_DATASET_SIZE];
712
713 /* This is a 128 bit unique identifier. For the demo we make it 32 bits only as it is easier to manipulate. */
714 ULONG pima_device_object_persistent_unique_identifier = 1;
715
716
717 /* Prototype for test control return. */
718
719 void test_control_return(UINT status);
720
error_callback(UINT system_level,UINT system_context,UINT error_code)721 static VOID error_callback(UINT system_level, UINT system_context, UINT error_code)
722 {
723
724 error_callback_counter ++;
725
726 if (!error_callback_ignore)
727 {
728 {
729 /* Failed test. */
730 printf("Error #%d, system_level: %d, system_context: %d, error_code: 0x%x\n", __LINE__, system_level, system_context, error_code);
731 test_control_return(1);
732 }
733 }
734 }
735
sleep_break_on_error(VOID)736 static UINT sleep_break_on_error(VOID)
737 {
738
739 if (error_callback_counter >= 3)
740 return error_callback_counter;
741
742 return UX_SUCCESS;
743 }
744
745 /* Define the ISR dispatch routine. */
746
test_isr(void)747 static void test_isr(void)
748 {
749
750 /* For further expansion of interrupt-level testing. */
751 }
752
753
754
test_system_host_change_function(ULONG event,UX_HOST_CLASS * cls,VOID * inst)755 static UINT test_system_host_change_function(ULONG event, UX_HOST_CLASS *cls, VOID *inst)
756 {
757 // printf("hChg:%lx, %p, %p\n", event, cls, inst);
758 switch(event)
759 {
760 case UX_DEVICE_INSERTION:
761 if (cls->ux_host_class_entry_function == ux_host_class_pima_entry)
762 {
763 pima_host = (UX_HOST_CLASS_PIMA *)inst;
764 }
765 break;
766
767 case UX_DEVICE_REMOVAL:
768 if (cls->ux_host_class_entry_function == ux_host_class_pima_entry)
769 {
770 if ((VOID*)pima_host == inst)
771 pima_host = UX_NULL;
772 }
773 break;
774
775 default:
776 break;
777 }
778 return 0;
779 }
780
test_pima_instance_activate(VOID * instance)781 static VOID test_pima_instance_activate(VOID *instance)
782 {
783 pima_device = (UX_SLAVE_CLASS_PIMA_DEVICE *)instance;
784 }
test_pima_instance_deactivate(VOID * instance)785 static VOID test_pima_instance_deactivate(VOID *instance)
786 {
787 if ((VOID *)pima_device == instance)
788 pima_device = UX_NULL;
789 }
790
791
792 /* Define what the initial system looks like. */
793
794 #ifdef CTEST
test_application_define(void * first_unused_memory)795 void test_application_define(void *first_unused_memory)
796 #else
797 void usbx_pima_basic_test_application_define(void *first_unused_memory)
798 #endif
799 {
800
801 UINT status;
802 CHAR * stack_pointer;
803 CHAR * memory_pointer;
804 ULONG test_n;
805
806 /* Inform user. */
807 printf("Running PIMA Basic Functionality Test............................... ");
808
809 /* Reset testing counts. */
810 ux_test_utility_sim_mutex_create_count_reset();
811 ux_test_utility_sim_sem_create_count_reset();
812 ux_test_utility_sim_sem_get_count_reset();
813 /* Reset error generations */
814 ux_test_utility_sim_sem_error_generation_stop();
815 ux_test_utility_sim_mutex_error_generation_stop();
816 ux_test_utility_sim_sem_get_error_generation_stop();
817
818 ux_utility_memory_set(ram_disk_memory, 0, UX_TEST_RAM_DISK_SIZE);
819 fx_system_initialize();
820 status = fx_media_format(&ram_disk, _fx_ram_driver, ram_disk_memory, ram_disk_buffer, 512, "RAM DISK", 2, 512, 0, (UX_TEST_RAM_DISK_SIZE / 512), 512, 4, 1, 1);
821 if (status != UX_SUCCESS)
822 {
823 printf("ERROR #%d\n", __LINE__);
824 test_control_return(1);
825 }
826 status = fx_media_open(&ram_disk, "RAM DISK", _fx_ram_driver, ram_disk_memory, ram_disk_buffer, 512);
827 if (status != UX_SUCCESS)
828 {
829 printf("ERROR #%d\n", __LINE__);
830 test_control_return(1);
831 }
832
833 /* Initialize the free memory pointer */
834 stack_pointer = (CHAR *) usbx_memory;
835 memory_pointer = stack_pointer + (UX_TEST_STACK_SIZE * 2);
836
837 /* Initialize USBX Memory */
838 status = ux_system_initialize(memory_pointer, UX_TEST_MEMORY_SIZE, UX_NULL,0);
839 if (status != UX_SUCCESS)
840 {
841 printf("ERROR #%d\n", __LINE__);
842 test_control_return(1);
843 }
844
845 /* Register the error callback. */
846 _ux_utility_error_callback_register(error_callback);
847
848 /* The code below is required for installing the host portion of USBX */
849 status = ux_host_stack_initialize(test_system_host_change_function);
850 if (status != UX_SUCCESS)
851 {
852 printf("ERROR #%d\n", __LINE__);
853 test_control_return(1);
854 }
855
856 /* Register PIMA class. */
857 status = ux_host_stack_class_register(_ux_system_host_class_pima_name, ux_host_class_pima_entry);
858 if (status != UX_SUCCESS)
859 {
860 printf("ERROR #%d\n", __LINE__);
861 test_control_return(1);
862 }
863
864 /* The code below is required for installing the device portion of USBX. No call back for
865 device status change in this example. */
866 status = ux_device_stack_initialize(device_framework_high_speed, DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED,
867 device_framework_full_speed, DEVICE_FRAMEWORK_LENGTH_FULL_SPEED,
868 string_framework, STRING_FRAMEWORK_LENGTH,
869 language_id_framework, LANGUAGE_ID_FRAMEWORK_LENGTH,UX_NULL);
870 if (status != UX_SUCCESS)
871 {
872 printf("ERROR #%d\n", __LINE__);
873 test_control_return(1);
874 }
875
876 /* MTP requires MTP extensions. */
877 status = _ux_device_stack_microsoft_extension_register(UX_TEST_VENDOR_REQUEST, pima_device_vendor_request);
878 if (status != UX_SUCCESS)
879 {
880 printf("ERROR #%d\n", __LINE__);
881 test_control_return(1);
882 }
883
884 /* Set the parameters for PIMA device. */
885 pima_device_parameter.ux_device_class_pima_instance_activate = test_pima_instance_activate;
886 pima_device_parameter.ux_device_class_pima_instance_deactivate = test_pima_instance_deactivate;
887
888 /* Initialize the pima device parameter. */
889 pima_device_parameter.ux_device_class_pima_parameter_manufacturer = pima_device_info_vendor_name;
890 pima_device_parameter.ux_device_class_pima_parameter_model = pima_device_info_product_name;
891 pima_device_parameter.ux_device_class_pima_parameter_device_version = pima_device_info_version;
892 pima_device_parameter.ux_device_class_pima_parameter_serial_number = pima_device_info_serial_no;
893 pima_device_parameter.ux_device_class_pima_parameter_storage_id = UX_TEST_PIMA_STORAGE_ID;
894 pima_device_parameter.ux_device_class_pima_parameter_storage_type = UX_DEVICE_CLASS_PIMA_STC_FIXED_RAM;
895 pima_device_parameter.ux_device_class_pima_parameter_storage_file_system_type = UX_DEVICE_CLASS_PIMA_FSTC_GENERIC_FLAT;
896 pima_device_parameter.ux_device_class_pima_parameter_storage_access_capability = UX_DEVICE_CLASS_PIMA_AC_READ_WRITE;
897 pima_device_parameter.ux_device_class_pima_parameter_storage_max_capacity_low = ram_disk.fx_media_total_clusters * ram_disk.fx_media_sectors_per_cluster * ram_disk.fx_media_bytes_per_sector;
898 pima_device_parameter.ux_device_class_pima_parameter_storage_max_capacity_high = 0;
899 pima_device_parameter.ux_device_class_pima_parameter_storage_free_space_low = ram_disk.fx_media_available_clusters * ram_disk.fx_media_sectors_per_cluster * ram_disk.fx_media_bytes_per_sector;
900 pima_device_parameter.ux_device_class_pima_parameter_storage_free_space_high = 0;
901 pima_device_parameter.ux_device_class_pima_parameter_storage_free_space_image = 0xFFFFFFFF;
902 pima_device_parameter.ux_device_class_pima_parameter_storage_description = pima_parameter_volume_description;
903 pima_device_parameter.ux_device_class_pima_parameter_storage_volume_label = pima_parameter_volume_label;
904 pima_device_parameter.ux_device_class_pima_parameter_device_properties_list = pima_device_prop_supported;
905 pima_device_parameter.ux_device_class_pima_parameter_supported_capture_formats_list= pima_device_supported_capture_formats;
906 pima_device_parameter.ux_device_class_pima_parameter_supported_image_formats_list = pima_device_supported_image_formats;
907 pima_device_parameter.ux_device_class_pima_parameter_object_properties_list = pima_device_object_prop_supported;
908
909 /* Define the callbacks. */
910 pima_device_parameter.ux_device_class_pima_parameter_device_reset = pima_device_device_reset;
911 pima_device_parameter.ux_device_class_pima_parameter_device_prop_desc_get = pima_device_device_prop_desc_get;
912 pima_device_parameter.ux_device_class_pima_parameter_device_prop_value_get = pima_device_device_prop_value_get;
913 pima_device_parameter.ux_device_class_pima_parameter_device_prop_value_set = pima_device_device_prop_value_set;
914 pima_device_parameter.ux_device_class_pima_parameter_storage_format = pima_device_storage_format;
915 pima_device_parameter.ux_device_class_pima_parameter_storage_info_get = pima_device_storage_info_get;
916 pima_device_parameter.ux_device_class_pima_parameter_object_number_get = pima_device_object_number_get;
917 pima_device_parameter.ux_device_class_pima_parameter_object_handles_get = pima_device_object_handles_get;
918 pima_device_parameter.ux_device_class_pima_parameter_object_info_get = pima_device_object_info_get;
919 pima_device_parameter.ux_device_class_pima_parameter_object_data_get = pima_device_object_data_get;
920 pima_device_parameter.ux_device_class_pima_parameter_object_info_send = pima_device_object_info_send;
921 pima_device_parameter.ux_device_class_pima_parameter_object_data_send = pima_device_object_data_send;
922 pima_device_parameter.ux_device_class_pima_parameter_object_delete = pima_device_object_delete;
923 pima_device_parameter.ux_device_class_pima_parameter_object_prop_desc_get = pima_device_object_prop_desc_get;
924 pima_device_parameter.ux_device_class_pima_parameter_object_prop_value_get = pima_device_object_prop_value_get;
925 pima_device_parameter.ux_device_class_pima_parameter_object_prop_value_set = pima_device_object_prop_value_set;
926 pima_device_parameter.ux_device_class_pima_parameter_object_references_get = pima_device_object_references_get;
927 pima_device_parameter.ux_device_class_pima_parameter_object_references_set = pima_device_object_references_set;
928
929 /* Store the instance owner. */
930 pima_device_parameter.ux_device_class_pima_parameter_application = (VOID *) 0;
931
932 /* Initialize the device PIMA class. */
933 status = ux_device_stack_class_register(_ux_system_slave_class_pima_name, ux_device_class_pima_entry,
934 1, 0, &pima_device_parameter);
935 if (status != UX_SUCCESS)
936 {
937 printf("ERROR #%d\n", __LINE__);
938 test_control_return(1);
939 }
940
941 /* Initialize the simulated device controller. */
942 status = _ux_dcd_sim_slave_initialize();
943 if (status != UX_SUCCESS)
944 {
945 printf("ERROR #%d\n", __LINE__);
946 test_control_return(1);
947 }
948
949 /* Register all the USB host controllers available in this system */
950 status = ux_host_stack_hcd_register(_ux_system_host_hcd_simulator_name, _ux_test_hcd_sim_host_initialize,0,0);
951 if (status != UX_SUCCESS)
952 {
953 printf("ERROR #%d\n", __LINE__);
954 test_control_return(1);
955 }
956
957 /* Create the main host simulation thread. */
958 status = tx_thread_create(&test_thread_host_simulation, "tx demo host simulation", test_thread_host_simulation_entry, 0,
959 stack_pointer, UX_TEST_STACK_SIZE,
960 20, 20, 1, TX_AUTO_START);
961 if (status != UX_SUCCESS)
962 {
963 printf("ERROR #%d\n", __LINE__);
964 test_control_return(1);
965 }
966
967 /* Create the main slave simulation thread. */
968 status = tx_thread_create(&test_thread_device_simulation, "tx demo device simulation", test_thread_device_simulation_entry, 0,
969 stack_pointer + UX_TEST_STACK_SIZE, UX_TEST_STACK_SIZE,
970 20, 20, 1, TX_AUTO_START);
971 if (status != UX_SUCCESS)
972 {
973 printf("ERROR #%d\n", __LINE__);
974 test_control_return(1);
975 }
976 }
977
test_call_pima_apis(void)978 static void test_call_pima_apis(void)
979 {
980 UINT status;
981 ULONG actual_length;
982
983 status = ux_host_class_pima_device_info_get(pima_host, &pima_host_device);
984 UX_TEST_CHECK_SUCCESS(status);
985
986 status = ux_host_class_pima_session_open(pima_host, &pima_host_session);
987 UX_TEST_CHECK_SUCCESS(status);
988
989 status = ux_host_class_pima_storage_ids_get(pima_host, &pima_host_session, host_buffer32, 64);
990 UX_TEST_CHECK_SUCCESS(status);
991
992 status = ux_host_class_pima_num_objects_get(pima_host, &pima_host_session, 0, UX_HOST_CLASS_PIMA_OFC_UNDEFINED);
993 UX_TEST_CHECK_SUCCESS(status);
994
995 status = ux_host_class_pima_object_handles_get(pima_host, &pima_host_session, host_buffer32, 64, 0, UX_HOST_CLASS_PIMA_OFC_UNDEFINED, 0);
996 UX_TEST_CHECK_SUCCESS(status);
997
998 status = ux_host_class_pima_object_info_get(pima_host, &pima_host_session, 0, &pima_host_object);
999 UX_TEST_CHECK_SUCCESS(status);
1000
1001 status = ux_host_class_pima_object_open(pima_host, &pima_host_session, 0, &pima_host_object);
1002 UX_TEST_CHECK_SUCCESS(status);
1003
1004 status = ux_host_class_pima_object_close(pima_host, &pima_host_session, 0, &pima_host_object);
1005 UX_TEST_CHECK_SUCCESS(status);
1006
1007 status = ux_host_class_pima_session_close(pima_host, &pima_host_session);
1008 UX_TEST_CHECK_SUCCESS(status);
1009 }
1010
test_thread_host_simulation_entry(ULONG arg)1011 void test_thread_host_simulation_entry(ULONG arg)
1012 {
1013
1014 UINT status;
1015 INT i;
1016
1017 for (i = 0; i < 100; i ++)
1018 {
1019 if (pima_host && pima_device)
1020 break;
1021 ux_utility_delay_ms(1);
1022 }
1023 if (pima_host == UX_NULL || pima_device == UX_NULL)
1024 {
1025 printf("ERROR #%d\n", __LINE__);
1026 test_control_return(1);
1027 }
1028
1029 test_call_pima_apis();
1030
1031 stepinfo(">>>>>>>>>>>> All Done\n");
1032
1033 /* Finally disconnect the device. */
1034 ux_device_stack_disconnect();
1035
1036 /* And deinitialize the class. */
1037 status = ux_device_stack_class_unregister(_ux_system_slave_class_pima_name, ux_device_class_pima_entry);
1038
1039 /* Deinitialize the device side of usbx. */
1040 _ux_device_stack_uninitialize();
1041
1042 /* And finally the usbx system resources. */
1043 _ux_system_uninitialize();
1044
1045 /* Successful test. */
1046 printf("SUCCESS!\n");
1047 test_control_return(0);
1048
1049 }
1050
1051
test_thread_device_simulation_entry(ULONG arg)1052 void test_thread_device_simulation_entry(ULONG arg)
1053 {
1054
1055 UINT status;
1056
1057 while(1)
1058 {
1059
1060 /* Sleep so ThreadX on Win32 will delete this thread. */
1061 tx_thread_sleep(10);
1062 }
1063 }
1064
1065
pima_device_vendor_request(ULONG request,ULONG request_value,ULONG request_index,ULONG request_length,UCHAR * transfer_request_buffer,ULONG * transfer_request_length)1066 UINT pima_device_vendor_request(ULONG request, ULONG request_value, ULONG request_index, ULONG request_length,
1067 UCHAR *transfer_request_buffer,
1068 ULONG *transfer_request_length)
1069 {
1070 UINT status;
1071 ULONG length;
1072
1073 /* Do some sanity check. The request must be our vendor request. */
1074 if (request != UX_TEST_VENDOR_REQUEST)
1075
1076 /* Do not proceed. */
1077 return(UX_ERROR);
1078
1079 /* Check the wIndex value. Values can be :
1080 0x0001 : Genre
1081 0x0004 : Extended compatible ID
1082 0x0005 : Extended properties */
1083 switch (request_index)
1084 {
1085
1086 case 0x0001 :
1087
1088 /* Not sure what this is for. Windows does not seem to request this. Drop it. */
1089 status = UX_ERROR;
1090 break;
1091
1092 case 0x0004 :
1093 case 0x0005 :
1094
1095 /* Length to return. */
1096 length = UX_MIN(0x28, request_length);
1097
1098 /* Length check. */
1099 UX_ASSERT(*transfer_request_length >= length);
1100
1101 /* At least length should be returned. */
1102 if (length < 4)
1103 {
1104 status = UX_ERROR;
1105 break;
1106 }
1107 status = UX_SUCCESS;
1108
1109 /* Return the length. */
1110 *transfer_request_length = length;
1111
1112 /* Reset returned bytes. */
1113 ux_utility_memory_set(transfer_request_buffer, 0, length);
1114
1115 /* Build the descriptor to be returned. This is not a composite descriptor. Single MTP.
1116 First dword is length of the descriptor. */
1117 ux_utility_long_put(transfer_request_buffer, 0x0028);
1118 length -= 4;
1119
1120 /* Then the version. fixed to 0x0100. */
1121 if (length < 2)
1122 break;
1123 ux_utility_short_put(transfer_request_buffer + 4, 0x0100);
1124 length -= 2;
1125
1126 /* Then the descriptor ID. Fixed to 0x0004. */
1127 if (length < 2)
1128 break;
1129 ux_utility_short_put(transfer_request_buffer + 6, 0x0004);
1130 length -= 2;
1131
1132 /* Then the bcount field. Fixed to 0x0001. */
1133 if (length < 1)
1134 break;
1135 *(transfer_request_buffer + 8) = 0x01;
1136 length -= 1;
1137
1138 /* Reset the next 7 bytes. */
1139 if (length < 7)
1140 break;
1141 ux_utility_memory_set(transfer_request_buffer + 9, 0x00, 7);
1142 length -= 7;
1143
1144 /* Last byte of header is the interface number, here 0. */
1145 if (length < 1)
1146 break;
1147 *(transfer_request_buffer + 16) = 0x00;
1148 length -= 1;
1149
1150 /* First byte of descriptor is set to 1. */
1151 if (length < 1)
1152 break;
1153 *(transfer_request_buffer + 17) = 0x01;
1154 length -= 1;
1155
1156 /* Reset the next 8 + 8 + 6 bytes. */
1157 if (length < (8+8+6))
1158 break;
1159 ux_utility_memory_set(transfer_request_buffer + 18, 0x00, (8 + 8 + 6));
1160 length -= 8+8+6;
1161
1162 /* Set the compatible ID to MTP. */
1163 if (length < 3)
1164 break;
1165 ux_utility_memory_copy(transfer_request_buffer + 18, "MTP", 3);
1166 length -= 3;
1167
1168 /* We are done here. */
1169 status = UX_SUCCESS;
1170 break;
1171
1172 default :
1173 status = UX_ERROR;
1174 break;
1175
1176 }
1177 /* Return status to device stack. */
1178 return(status);
1179 }
1180
pima_device_device_reset()1181 UINT pima_device_device_reset()
1182 {
1183
1184 /* Do nothing here. Return Success. */
1185 return(UX_SUCCESS);
1186
1187 }
1188
pima_device_device_prop_desc_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG device_property,UCHAR ** device_prop_dataset,ULONG * device_prop_dataset_length)1189 UINT pima_device_device_prop_desc_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1190 ULONG device_property,
1191 UCHAR **device_prop_dataset,
1192 ULONG *device_prop_dataset_length)
1193
1194 {
1195 UINT status;
1196
1197 /* We assume the worst. */
1198 status = UX_DEVICE_CLASS_PIMA_RC_DEVICE_PROP_NOT_SUPPORTED;
1199
1200 /* Check which device property the host is inquiring. It needs
1201 to be one that we have declared. */
1202 switch (device_property)
1203 {
1204
1205 case UX_DEVICE_CLASS_PIMA_DEV_PROP_DATE_TIME :
1206
1207 /* Buffer length validation. */
1208 UX_ASSERT(*device_prop_dataset_length >= DEVICE_PROP_DATE_TIME_DATASET_LENGTH);
1209
1210 /* The host is inquiring about the date/time dataset. */
1211 *device_prop_dataset = pima_device_prop_date_time_dataset;
1212 *device_prop_dataset_length = DEVICE_PROP_DATE_TIME_DATASET_LENGTH;
1213
1214 /* We have a successful operation. */
1215 status = UX_SUCCESS;
1216
1217 break;
1218
1219 case UX_DEVICE_CLASS_PIMA_DEV_PROP_SYNCHRONIZATION_PARTNER :
1220
1221 /* Buffer length validation. */
1222 UX_ASSERT(*device_prop_dataset_length >= DEVICE_PROP_SYNCHRONIZATION_PARTNER_DATASET_LENGTH);
1223
1224 /* The host is inquiring about the synchronization partner dataset. */
1225 *device_prop_dataset = pima_device_prop_synchronization_partner_dataset;
1226 *device_prop_dataset_length = DEVICE_PROP_SYNCHRONIZATION_PARTNER_DATASET_LENGTH;
1227
1228 /* We have a successful operation. */
1229 status = UX_SUCCESS;
1230
1231 break;
1232
1233 case UX_DEVICE_CLASS_PIMA_DEV_PROP_DEVICE_FRIENDLY_NAME :
1234
1235 /* Buffer length validation. */
1236 UX_ASSERT(*device_prop_dataset_length >= DEVICE_PROP_DEVICE_FRIENDLY_NAME_DATASET_LENGTH);
1237
1238 /* The host is inquiring about the device friendly name dataset. */
1239 *device_prop_dataset = pima_device_prop_device_friendly_name_dataset;
1240 *device_prop_dataset_length = DEVICE_PROP_DEVICE_FRIENDLY_NAME_DATASET_LENGTH;
1241
1242 /* We have a successful operation. */
1243 status = UX_SUCCESS;
1244
1245 break;
1246
1247 default :
1248
1249 /* We get here when the Initiator inquires about a property we don't know about.
1250 That should never happen as the properties are declared to the initiator. */
1251 status = UX_DEVICE_CLASS_PIMA_RC_DEVICE_PROP_NOT_SUPPORTED;
1252
1253 break;
1254 }
1255
1256 /* Return what we found. */
1257 return(status);
1258
1259 }
1260
pima_device_device_prop_value_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG device_property,UCHAR ** device_prop_value,ULONG * device_prop_value_length)1261 UINT pima_device_device_prop_value_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1262 ULONG device_property,
1263 UCHAR **device_prop_value,
1264 ULONG *device_prop_value_length)
1265 {
1266
1267 UINT status;
1268
1269 /* We assume the worst. */
1270 status = UX_DEVICE_CLASS_PIMA_RC_DEVICE_PROP_NOT_SUPPORTED;
1271
1272 /* Check which device property the host is inquiring. It needs
1273 to be one that we have declared. */
1274 switch (device_property)
1275 {
1276
1277 case UX_DEVICE_CLASS_PIMA_DEV_PROP_DATE_TIME :
1278
1279 /* Buffer length validation. */
1280 UX_ASSERT(*device_prop_value_length >= 33);
1281
1282 /* The host is inquiring about the date/time value. */
1283 *device_prop_value = pima_device_prop_date_time_dataset + 6;
1284 *device_prop_value_length = 33;
1285
1286 /* We have a successful operation. */
1287 status = UX_SUCCESS;
1288
1289 break;
1290
1291 case UX_DEVICE_CLASS_PIMA_DEV_PROP_SYNCHRONIZATION_PARTNER :
1292
1293 /* Buffer length validation. */
1294 UX_ASSERT(*device_prop_value_length >= 1);
1295
1296 /* The host is inquiring about the synchronization name dataset. */
1297 *device_prop_value = pima_device_prop_synchronization_partner_dataset + 6;
1298 *device_prop_value_length = 1;
1299
1300 /* We have a successful operation. */
1301 status = UX_SUCCESS;
1302
1303 break;
1304
1305 case UX_DEVICE_CLASS_PIMA_DEV_PROP_DEVICE_FRIENDLY_NAME :
1306
1307 /* Buffer length validation. */
1308 UX_ASSERT(*device_prop_value_length >= 29);
1309
1310 /* The host is inquiring about the device friendly name dataset. */
1311 *device_prop_value = pima_device_prop_device_friendly_name_dataset + 6;
1312 *device_prop_value_length = 29;
1313
1314 /* We have a successful operation. */
1315 status = UX_SUCCESS;
1316
1317 break;
1318
1319 default :
1320
1321 /* We get here when the Initiator inquires about a property we don't know about.
1322 That should never happen as the properties are declared to the initiator. */
1323 status = UX_DEVICE_CLASS_PIMA_RC_DEVICE_PROP_NOT_SUPPORTED;
1324
1325 break;
1326 }
1327
1328 /* Return what we found. */
1329 return(status);
1330
1331 }
1332
pima_device_device_prop_value_set(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG device_property,UCHAR * device_prop_value,ULONG device_prop_value_length)1333 UINT pima_device_device_prop_value_set(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1334 ULONG device_property,
1335 UCHAR *device_prop_value,
1336 ULONG device_prop_value_length)
1337 {
1338
1339 UINT status;
1340
1341 /* We assume the worst. */
1342 status = UX_DEVICE_CLASS_PIMA_RC_DEVICE_PROP_NOT_SUPPORTED;
1343
1344 /* Check which device property the host wants to set. It needs
1345 to be one that we have declared. */
1346 switch (device_property)
1347 {
1348
1349 case UX_DEVICE_CLASS_PIMA_DEV_PROP_DATE_TIME :
1350
1351 /* The host wants to set time and date value.
1352 We only take the first 16 bytes of the Unicode string. */
1353 ux_utility_memory_copy (pima_device_prop_date_time_dataset + 6, device_prop_value, 0x10);
1354
1355 /* We have a successful operation. */
1356 status = UX_SUCCESS;
1357
1358 break;
1359
1360 }
1361
1362 /* Return what we found. */
1363 return(status);
1364
1365
1366 }
1367
1368
pima_device_storage_format(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG storage_id)1369 UINT pima_device_storage_format(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1370 ULONG storage_id)
1371 {
1372
1373 UINT status;
1374
1375 /* Check the storage ID. */
1376 if (storage_id == UX_TEST_PIMA_STORAGE_ID)
1377 {
1378
1379 /* Format the ram drive. */
1380 status = fx_media_format(&ram_disk, _fx_ram_driver, ram_disk_memory, ram_disk_buffer, 512, "RAM DISK", 2, 512, 0, UX_TEST_RAM_DISK_SIZE / 512, 512, 4, 1, 1);
1381
1382 /* Reset the handle counter. */
1383 pima_device_object_number_handles = 0;
1384
1385 /* Is there an error ? */
1386 if (status == UX_SUCCESS)
1387
1388 /* Success. */
1389 return(status);
1390
1391 else
1392
1393 /* Error. */
1394 return(UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED);
1395 }
1396 else
1397
1398 /* Error, wrong storage ID. */
1399 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_STORAGE_ID);
1400
1401 }
1402
1403
pima_device_storage_info_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG storage_id)1404 UINT pima_device_storage_info_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1405 ULONG storage_id)
1406 {
1407
1408 /* Check the storage ID. */
1409 if (storage_id == UX_TEST_PIMA_STORAGE_ID)
1410 {
1411
1412 /* We come here when the Initiator needs to update the storage info dataset.
1413 The PIMA structure has the storage info main dataset. This version only
1414 support one storage container. */
1415 pima -> ux_device_class_pima_storage_max_capacity_low = ram_disk.fx_media_total_clusters * ram_disk.fx_media_sectors_per_cluster * ram_disk.fx_media_bytes_per_sector;
1416 pima -> ux_device_class_pima_storage_max_capacity_high = 0;
1417 pima -> ux_device_class_pima_storage_free_space_low = ram_disk.fx_media_available_clusters * ram_disk.fx_media_sectors_per_cluster * ram_disk.fx_media_bytes_per_sector;
1418 pima -> ux_device_class_pima_storage_free_space_high = 0;
1419
1420
1421 /* Success. */
1422 return( UX_SUCCESS);
1423
1424 }
1425 else
1426
1427 /* Error, wrong storage ID. */
1428 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_STORAGE_ID);
1429
1430 }
1431
pima_device_object_number_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_format_code,ULONG object_association,ULONG * object_number)1432 UINT pima_device_object_number_get(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1433 ULONG object_format_code,
1434 ULONG object_association,
1435 ULONG *object_number)
1436 {
1437
1438 /* Return the object number. */
1439 *object_number = pima_device_object_number_handles;
1440
1441 /* Return success. */
1442 return(UX_SUCCESS);
1443 }
1444
pima_device_object_handles_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handles_format_code,ULONG object_handles_association,ULONG * object_handles_array,ULONG object_handles_max_number)1445 UINT pima_device_object_handles_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1446 ULONG object_handles_format_code,
1447 ULONG object_handles_association,
1448 ULONG *object_handles_array,
1449 ULONG object_handles_max_number)
1450 {
1451 ULONG handle_index;
1452 ULONG number_handles;
1453 ULONG found_handles;
1454 ULONG *object_handles_array_pointer;
1455
1456 /* Number of max handles we can store in our demo. */
1457 number_handles = UX_TEST_MAX_HANDLES;
1458 if (number_handles > object_handles_max_number)
1459 number_handles = object_handles_max_number;
1460
1461 /* We start with no handles found. */
1462 found_handles = 0;
1463
1464 /* We store the handles in the array pointer, skipping the array count. */
1465 object_handles_array_pointer = object_handles_array + 1;
1466
1467 /* Store all the handles we have in the media for the specific format code if utilized. */
1468 for (handle_index = 0; handle_index < number_handles; handle_index++)
1469 {
1470
1471 /* Check if this handle is valid. If 0, it may have been destroyed or unused yet. */
1472 if (pima_device_object_number_handles_array[handle_index] != 0)
1473 {
1474
1475 /* This handle is populated. Check the format code supplied by the app.
1476 if 0 or -1, we discard the format code check. If not 0 or -1 check
1477 it the stored object matches the format code. */
1478 if ((object_handles_format_code == 0) || (object_handles_format_code == 0xFFFFFFFF) ||
1479 pima_device_object_info_array[handle_index].ux_device_class_pima_object_format == object_handles_format_code)
1480 {
1481 /* We have a candidate. Store the handle. */
1482 ux_utility_long_put((UCHAR *) object_handles_array_pointer, pima_device_object_number_handles_array[handle_index]);
1483
1484 /* Next array container. */
1485 object_handles_array_pointer++;
1486
1487 /* We have found one handle more. */
1488 found_handles++;
1489
1490 /* Check if we are reaching the max array of handles. */
1491 if (found_handles == object_handles_max_number)
1492 {
1493
1494 /* Array is saturated. Store what we have found. */
1495 ux_utility_long_put((UCHAR *) object_handles_array, found_handles);
1496
1497 /* And return to the Pima class. */
1498 return(UX_SUCCESS);
1499
1500 }
1501 }
1502 }
1503
1504 }
1505
1506 /* Array is populated. Store what we have found. */
1507 ux_utility_long_put((UCHAR *) object_handles_array, found_handles);
1508
1509 /* And return to the Pima class. */
1510 return(UX_SUCCESS);
1511
1512 }
1513
pima_device_object_info_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,UX_SLAVE_CLASS_PIMA_OBJECT ** object)1514 UINT pima_device_object_info_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1515 ULONG object_handle,
1516 UX_SLAVE_CLASS_PIMA_OBJECT **object)
1517 {
1518 UINT status;
1519 ULONG handle_index;
1520
1521 /* Check the object handle. It must be in the local array. */
1522 status = pima_device_object_handle_check(object_handle, object, &handle_index);
1523
1524 /* Does the object handle exist ? */
1525 if (status == UX_SUCCESS)
1526 {
1527
1528 /* Yes, the handle is valid. The object pointer has been updated. */
1529 return(UX_SUCCESS);
1530 }
1531 else
1532
1533 /* Done here. Return error. */
1534 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
1535
1536 }
1537
pima_device_object_data_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,UCHAR * object_buffer,ULONG object_offset,ULONG object_length_requested,ULONG * object_actual_length)1538 UINT pima_device_object_data_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1539 ULONG object_handle,
1540 UCHAR *object_buffer,
1541 ULONG object_offset,
1542 ULONG object_length_requested,
1543 ULONG *object_actual_length)
1544
1545 {
1546
1547 UINT status;
1548 UINT status_close;
1549 ULONG handle_index;
1550 UX_SLAVE_CLASS_PIMA_OBJECT *object;
1551 CHAR object_filename[64];
1552
1553
1554 /* Check the object handle. It must be in the local array. */
1555 status = pima_device_object_handle_check(object_handle, &object, &handle_index);
1556
1557 /* Does the object handle exist ? */
1558 if (status != UX_SUCCESS)
1559 return(status);
1560
1561 /* Check if entire file is read,
1562 this could happen if last actual length equals to length requested. */
1563 if (object_offset >= pima_device_object_filex_array[handle_index].fx_file_current_file_size)
1564 {
1565
1566 /* Nothing to read. */
1567 *object_actual_length = 0;
1568 return(UX_SUCCESS);
1569 }
1570
1571 /* We are either at the beginning of the transfer or continuing the transfer.
1572 Check of the filex array handle exist already. */
1573 if (pima_device_object_filex_array[handle_index].fx_file_id == 0)
1574 {
1575
1576 /* The object file name is in Unicode, decrypt it first because FileX is not using
1577 unicode format. */
1578 _ux_utility_unicode_to_string(object -> ux_device_class_pima_object_filename, (UCHAR *) object_filename);
1579
1580 /* File not yet opened for this object. Open the file. */
1581 status = fx_file_open(&ram_disk, &pima_device_object_filex_array[handle_index], (CHAR *) object_filename, FX_OPEN_FOR_READ);
1582
1583 /* Any problems with the opening ? */
1584 if (status != UX_SUCCESS)
1585 return(UX_DEVICE_CLASS_PIMA_RC_OBJECT_NOT_OPENED);
1586
1587 }
1588
1589 /* Seek to the offset of the object file. */
1590 status = fx_file_seek(&pima_device_object_filex_array[handle_index], object_offset);
1591 if (status != UX_SUCCESS)
1592 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_REFERENCE);
1593
1594 /* Read from the file into the media buffer. */
1595 status = fx_file_read(&pima_device_object_filex_array[handle_index], object_buffer, object_length_requested, object_actual_length);
1596
1597 /* Check the status. */
1598 if (status == UX_SUCCESS)
1599
1600 /* Done. Operation successful. */
1601 status = UX_SUCCESS;
1602
1603 else
1604 {
1605
1606 /* See what the error might be. */
1607 switch (status)
1608 {
1609
1610 case FX_MEDIA_NOT_OPEN :
1611
1612 /* Problem with media. */
1613 status = UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
1614 break;
1615
1616 case FX_NO_MORE_SPACE :
1617
1618 /* Media is full. */
1619 status = UX_DEVICE_CLASS_PIMA_RC_STORE_FULL;
1620 break;
1621
1622 default :
1623 status = UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
1624 break;
1625
1626 }
1627 }
1628
1629 /* Check if we have read the entire file. We compare the current position in the file with the file size. */
1630 if (pima_device_object_filex_array[handle_index].fx_file_current_file_size == pima_device_object_filex_array[handle_index].fx_file_current_file_offset)
1631 {
1632
1633 /* This is the end of the transfer for the object. Close it. */
1634 status_close = fx_file_close(&pima_device_object_filex_array[handle_index]);
1635
1636 /* FX file id is not cleared by fx_file_close. */
1637 pima_device_object_filex_array[handle_index].fx_file_id = 0;
1638
1639 /* Check the status. */
1640 if (status_close == UX_SUCCESS && status == UX_SUCCESS)
1641
1642 /* Done. Operation successful. */
1643 return (UX_SUCCESS);
1644
1645 else
1646 {
1647
1648 /* See what the error might be. */
1649 switch (status_close)
1650 {
1651
1652 case FX_MEDIA_NOT_OPEN :
1653
1654 /* Problem with media. */
1655 status_close = UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
1656 break;
1657
1658 default :
1659 status_close = UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
1660 break;
1661
1662 }
1663
1664 /* If status is error. we return status. If status_close is error we return status_close. */
1665 if(status != UX_SUCCESS)
1666
1667 /* We return the status of read operation. */
1668 return(status);
1669
1670 else
1671
1672 /* Return status from close operation. */
1673 return(status_close);
1674
1675 }
1676 }
1677
1678 /* Done here. Return status. */
1679 return(status);
1680 }
1681
pima_device_object_info_send(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,UX_SLAVE_CLASS_PIMA_OBJECT * object,ULONG storage_id,ULONG parent_object_handle,ULONG * object_handle)1682 UINT pima_device_object_info_send (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1683 UX_SLAVE_CLASS_PIMA_OBJECT *object,
1684 ULONG storage_id,
1685 ULONG parent_object_handle,
1686 ULONG *object_handle)
1687 {
1688 ULONG handle_index;
1689 CHAR object_filename[64];
1690 UINT status;
1691
1692 /* Make sure we can accommodate a new object here. */
1693 if (pima_device_object_number_handles < UX_TEST_MAX_HANDLES)
1694 {
1695
1696 /* The object file name is in Unicode, decrypt it first because FileX is not using
1697 unicode format. */
1698 ux_utility_unicode_to_string(object -> ux_device_class_pima_object_filename, (UCHAR *) object_filename);
1699
1700 /* The object can be either an association object (a directory) or a regular file such
1701 a photo, music file, video file ... */
1702 if (object -> ux_device_class_pima_object_format == UX_DEVICE_CLASS_PIMA_OFC_ASSOCIATION)
1703 {
1704
1705 /* The object info refers to a association. We treat it as a folder. */
1706 status = fx_directory_create(&ram_disk, object_filename);
1707
1708 /* Check status. If error, identify the problem and convert FileX error code into PIMA error code. */
1709 if (status != UX_SUCCESS)
1710 {
1711
1712 /* See what the error might be. */
1713 switch (status)
1714 {
1715
1716 case FX_MEDIA_NOT_OPEN :
1717
1718 /* Problem with media. */
1719 status = UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
1720 break;
1721
1722 case FX_NO_MORE_SPACE :
1723
1724 /* Media is full. */
1725 status = UX_DEVICE_CLASS_PIMA_RC_STORE_FULL;
1726 break;
1727
1728 case FX_WRITE_PROTECT :
1729
1730 /* Media is write protected. */
1731 status = UX_DEVICE_CLASS_PIMA_RC_STORE_READ_ONLY;
1732 break;
1733
1734 default :
1735 status = UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
1736 break;
1737
1738 }
1739
1740 /* Could not create the object on the local media, return an error. */
1741 return (status);
1742 }
1743 }
1744 else
1745 {
1746 /* The format is for another object. */
1747 /* Create the destination file. */
1748 status = fx_file_create(&ram_disk, object_filename);
1749
1750 /* Check status. If error, identify the problem and convert FileX error code into PIMA error code. */
1751 if (status != UX_SUCCESS)
1752 {
1753
1754 /* See what the error might be. */
1755 switch (status)
1756 {
1757
1758 case FX_MEDIA_NOT_OPEN :
1759
1760 /* Problem with media. */
1761 status = UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
1762 break;
1763
1764 case FX_NO_MORE_SPACE :
1765
1766 /* Media is full. */
1767 status = UX_DEVICE_CLASS_PIMA_RC_STORE_FULL;
1768 break;
1769
1770 case FX_WRITE_PROTECT :
1771
1772 /* Media is write protected. */
1773 status = UX_DEVICE_CLASS_PIMA_RC_STORE_READ_ONLY;
1774 break;
1775
1776 default :
1777 status = UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
1778 break;
1779
1780 }
1781
1782 /* Could not create the object on the local media, return an error. */
1783 return (status);
1784 }
1785 }
1786
1787 /* The object is created. Store the object handle. Find a spot. */
1788 for (handle_index = 0; handle_index < UX_TEST_MAX_HANDLES; handle_index++)
1789 {
1790
1791 /* Check for an empty slot. */
1792 if (pima_device_object_number_handles_array[handle_index] == 0)
1793 {
1794
1795 /* We have found the place to store the handle and the object info. */
1796 ux_utility_memory_copy(&pima_device_object_info_array[handle_index], object, sizeof(UX_SLAVE_CLASS_PIMA_OBJECT));
1797 if (pima_device_object_info_array[handle_index].ux_device_class_pima_object_storage_id == 0)
1798 pima_device_object_info_array[handle_index].ux_device_class_pima_object_storage_id = storage_id;
1799 if (pima_device_object_info_array[handle_index].ux_device_class_pima_object_parent_object == 0xFFFFFFFF)
1800 pima_device_object_info_array[handle_index].ux_device_class_pima_object_parent_object = 0;
1801
1802 /* Remember the object handle locally. */
1803 pima_device_object_number_handles_array[handle_index] = handle_index + 1;
1804
1805 /* Extract from the object the MTP dataset information we need : StorageID.
1806 if the storage id in the object info dataset is 0, the Initiator leaves it to the responder to store the object. */
1807 if (object -> ux_device_class_pima_object_storage_id != 0)
1808 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_storage_id = object -> ux_device_class_pima_object_storage_id;
1809 else
1810 /* Take the storage ID given as a parameter by the function. */
1811 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_storage_id = storage_id;
1812
1813 /* Extract from the object the MTP dataset information we need : Format. */
1814 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_format = object -> ux_device_class_pima_object_format;
1815
1816 /* Extract from the object the MTP dataset information we need : Protection Status. */
1817 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_protection_status = object -> ux_device_class_pima_object_protection_status;
1818
1819 /* Extract from the object the MTP dataset information we need : Size. */
1820 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_size_low = object -> ux_device_class_pima_object_compressed_size;
1821 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_size_high = 0;
1822
1823 /* Extract from the object the MTP dataset information we need : Parent Object. */
1824 if (object -> ux_device_class_pima_object_parent_object == 0xFFFFFFFF)
1825 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_parent_object = 0;
1826 else
1827 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_parent_object = object -> ux_device_class_pima_object_parent_object;
1828
1829 /* Keep the file name in ASCIIZ. */
1830 ux_utility_unicode_to_string(object -> ux_device_class_pima_object_filename, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_file_name);
1831 ux_utility_unicode_to_string(object -> ux_device_class_pima_object_filename, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_name);
1832
1833 /* Keep the unique object identifier for this object. This is incremented each time we have a new object.
1834 This number is unique to the MTP device for every object stored, even after being deleted.
1835 There is a hack here. We only keep track of the first dword. A full implementation should ensure all 128 bits are used.
1836 The identifier is incremented as soon as it is being used. */
1837 pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_persistent_unique_object_identifier[0] = pima_device_object_persistent_unique_identifier++;
1838
1839 /* Return the object handle to the application. */
1840 *object_handle = handle_index + 1;
1841
1842 /* Increment the number of known handles. */
1843 pima_device_object_number_handles++;
1844
1845 /* We are done here. Return success. */
1846 return(UX_SUCCESS);
1847 }
1848 }
1849
1850 /* We should never get here. */
1851 return(UX_DEVICE_CLASS_PIMA_RC_STORE_FULL);
1852
1853 }
1854
1855 /* No more space for handle. Return storage full. */
1856 return(UX_DEVICE_CLASS_PIMA_RC_STORE_FULL);
1857
1858 }
1859
1860
pima_device_object_data_send(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,ULONG phase,UCHAR * object_buffer,ULONG object_offset,ULONG object_length)1861 UINT pima_device_object_data_send (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
1862 ULONG object_handle,
1863 ULONG phase ,
1864 UCHAR *object_buffer,
1865 ULONG object_offset,
1866 ULONG object_length)
1867 {
1868
1869 UINT status;
1870 ULONG handle_index;
1871 UX_SLAVE_CLASS_PIMA_OBJECT *object;
1872 CHAR object_filename[64];
1873
1874 /* Check the object handle. It must be in the local array. */
1875 status = pima_device_object_handle_check(object_handle, &object, &handle_index);
1876
1877 /* Does the object handle exist ? */
1878 if (status == UX_SUCCESS)
1879 {
1880
1881 /* Check the phase. Either Active or Complete. */
1882 switch (phase)
1883 {
1884
1885 case UX_DEVICE_CLASS_PIMA_OBJECT_TRANSFER_PHASE_ACTIVE :
1886
1887 /* We are either at the beginning of the transfer or continuing the transfer. */
1888 if (object_offset == 0)
1889 {
1890
1891 /* The object file name is in Unicode, decrypt it first because FileX is not using
1892 unicode format. */
1893 ux_utility_unicode_to_string(object -> ux_device_class_pima_object_filename, (UCHAR *) object_filename);
1894
1895 /* Open the file on the media since we expect a SendObject. */
1896 status = fx_file_open(&ram_disk, &pima_device_object_filex_array[handle_index], object_filename, FX_OPEN_FOR_WRITE);
1897 if (status != UX_SUCCESS)
1898 return(UX_DEVICE_CLASS_PIMA_RC_OBJECT_NOT_OPENED);
1899
1900 /* Seek to the beginning of the object file. */
1901 status = fx_file_seek(&pima_device_object_filex_array[handle_index], 0);
1902 if (status != UX_SUCCESS)
1903 return(UX_DEVICE_CLASS_PIMA_RC_OBJECT_NOT_OPENED);
1904 }
1905
1906 /* We write the object data to the media. */
1907 status = fx_file_write(&pima_device_object_filex_array[handle_index], object_buffer, object_length);
1908
1909 /* Check the status. */
1910 if (status == UX_SUCCESS)
1911
1912 /* Done. Operation successful. */
1913 return (UX_SUCCESS);
1914
1915 else
1916 {
1917
1918 /* See what the error might be. */
1919 switch (status)
1920 {
1921
1922 case FX_MEDIA_NOT_OPEN :
1923
1924 /* Problem with media. */
1925 status = UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
1926 break;
1927
1928 case FX_NO_MORE_SPACE :
1929
1930 /* Media is full. */
1931 status = UX_DEVICE_CLASS_PIMA_RC_STORE_FULL;
1932 break;
1933
1934 case FX_WRITE_PROTECT :
1935
1936 /* Media is write protected. */
1937 status = UX_DEVICE_CLASS_PIMA_RC_STORE_READ_ONLY;
1938 break;
1939
1940 default :
1941 status = UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
1942 break;
1943
1944 }
1945 /* Return the error. */
1946 return(status);
1947
1948 }
1949 break;
1950
1951 case UX_DEVICE_CLASS_PIMA_OBJECT_TRANSFER_PHASE_COMPLETED :
1952
1953 /* Save final object size. */
1954 pima_device_object_info_array[handle_index].ux_device_class_pima_object_compressed_size =
1955 pima_device_object_filex_array[handle_index].fx_file_current_file_size;
1956
1957 /* This is the end of the transfer for the object. Close it. */
1958 status = fx_file_close(&pima_device_object_filex_array[handle_index]);
1959 pima_device_object_filex_array[handle_index].fx_file_id = 0;
1960
1961 /* Check the status. */
1962 if (status == UX_SUCCESS)
1963
1964 /* Done. Operation successful. */
1965 return (UX_SUCCESS);
1966
1967 else
1968 {
1969
1970 /* See what the error might be. */
1971 switch (status)
1972 {
1973
1974 case FX_MEDIA_NOT_OPEN :
1975
1976 /* Problem with media. */
1977 status = UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
1978 break;
1979
1980 default :
1981 status = UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
1982 break;
1983
1984 }
1985 /* Return the error. */
1986 return(status);
1987
1988 }
1989 break;
1990
1991 case UX_DEVICE_CLASS_PIMA_OBJECT_TRANSFER_PHASE_COMPLETED_ERROR :
1992
1993 /* Close and delete the object. */
1994 pima_device_object_delete(pima, object_handle);
1995
1996 /* We return OK no matter what. */
1997 return(UX_SUCCESS);
1998 }
1999 }
2000
2001 /* Done here. Return error. */
2002 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
2003
2004 }
2005
pima_device_object_delete(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle)2006 UINT pima_device_object_delete(struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
2007 ULONG object_handle)
2008 {
2009 UX_SLAVE_CLASS_PIMA_OBJECT *object;
2010 ULONG handle_index;
2011 CHAR object_filename[64];
2012 UINT status;
2013
2014 /* Check the object handle. It must be in the local array. */
2015 status = pima_device_object_handle_check(object_handle, &object, &handle_index);
2016
2017 /* Does the object handle exist ? */
2018 if (status == UX_SUCCESS)
2019 {
2020
2021 /* The object file name is in Unicode, decrypt it first because FileX is not using
2022 unicode format. */
2023 ux_utility_unicode_to_string(object -> ux_device_class_pima_object_filename, (UCHAR *) object_filename);
2024
2025 /* Yes, the handle is valid. The object pointer has been updated. */
2026 /* The object may still be opened, try to close the handle first. */
2027 status = fx_file_close(&pima_device_object_filex_array[handle_index]);
2028
2029 /* Delete the destination file. */
2030 status = fx_file_delete(&ram_disk, object_filename);
2031
2032 /* Check if we had an error. */
2033 if (status != UX_SUCCESS)
2034 {
2035
2036 /* See what the error might be. */
2037 switch (status)
2038 {
2039
2040 case FX_MEDIA_NOT_OPEN :
2041
2042 /* Problem with media. */
2043 status = UX_DEVICE_CLASS_PIMA_RC_STORE_NOT_AVAILABLE;
2044 break;
2045
2046 case FX_WRITE_PROTECT :
2047
2048 /* Media is write protected. */
2049 status = UX_DEVICE_CLASS_PIMA_RC_STORE_READ_ONLY;
2050 break;
2051
2052 default :
2053 status = UX_DEVICE_CLASS_PIMA_RC_ACCESS_DENIED;
2054 break;
2055 }
2056
2057 /* Return the error code. */
2058 return(status);
2059
2060 }
2061 else
2062 {
2063
2064 /* The object was deleted on disk. Now update the internal application array tables. */
2065 pima_device_object_number_handles_array[handle_index] = 0;
2066
2067 /* Update the number of handles in the system. */
2068 pima_device_object_number_handles--;
2069
2070 /* We are done here. */
2071 return(UX_SUCCESS);
2072 }
2073
2074 }
2075 else
2076
2077 /* Done here. Return error. */
2078 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
2079 }
2080
2081
pima_device_object_prop_desc_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_property,ULONG object_format_code,UCHAR ** object_prop_dataset,ULONG * object_prop_dataset_length)2082 UINT pima_device_object_prop_desc_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
2083 ULONG object_property,
2084 ULONG object_format_code,
2085 UCHAR **object_prop_dataset,
2086 ULONG *object_prop_dataset_length)
2087 {
2088 UINT status;
2089 UCHAR *object_property_dataset_data;
2090 ULONG object_property_dataset_data_length;
2091
2092 /* Check the object format belongs to the list. 3 categories : generic, audio, video */
2093 switch (object_format_code)
2094 {
2095
2096 case UX_DEVICE_CLASS_PIMA_OFC_UNDEFINED :
2097 case UX_DEVICE_CLASS_PIMA_OFC_ASSOCIATION :
2098 case UX_DEVICE_CLASS_PIMA_OFC_MP3 :
2099 case UX_DEVICE_CLASS_PIMA_OFC_ASF :
2100 case UX_DEVICE_CLASS_PIMA_OFC_WMA :
2101 case UX_DEVICE_CLASS_PIMA_OFC_WMV :
2102 case UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_ALBUM :
2103 case UX_DEVICE_CLASS_PIMA_OFC_ABSTRACT_AUDIO_AND_VIDEO_PLAYLIST :
2104
2105 /* Set the pointer to the dataset_buffer. */
2106 object_property_dataset_data = pima_device_object_property_dataset_data_buffer;
2107
2108 /* Isolate the property. That will determine the dataset header. */
2109 switch (object_property)
2110 {
2111 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID :
2112
2113 /* Add the property code. */
2114 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID);
2115
2116 /* Data type is UINT16. */
2117 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2118
2119 /* GetSet value is GET. */
2120 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2121
2122 /* Default value is UINT16. */
2123 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2124
2125 /* Group code is NULL. */
2126 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 0);
2127
2128 /* Form Flag is not used. */
2129 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 6) = 0;
2130
2131 /* Set the length. */
2132 object_property_dataset_data_length = 12;
2133
2134 /* We could create this property. */
2135 status = UX_SUCCESS;
2136
2137 /* Done here. */
2138 break;
2139
2140 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT :
2141
2142 /* Add the property code. */
2143 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT);
2144
2145 /* Data type is UINT16. */
2146 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2147
2148 /* GetSet value is GET. */
2149 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2150
2151 /* Default value is UINT16. */
2152 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2153
2154 /* Group code is 3. */
2155 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 3);
2156
2157 /* Form Flag is not used. */
2158 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 6) = 0;
2159
2160 /* Set the length. */
2161 object_property_dataset_data_length = 12;
2162
2163 /* We could create this property. */
2164 status = UX_SUCCESS;
2165
2166 /* Done here. */
2167 break;
2168
2169 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS :
2170
2171 /* Add the property code. */
2172 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS);
2173
2174 /* Data type is UINT16. */
2175 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2176
2177 /* GetSet value is GET. */
2178 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2179
2180 /* Default value is UINT16. */
2181 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2182
2183 /* Group code is 4. */
2184 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 4);
2185
2186 /* Form Flag ENUM. */
2187 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 6) = 2;
2188
2189 /* Number of elements in Enum array. */
2190 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 7, 2);
2191
2192 /* Elements in Enum array. Here we store only No protection and Read-Only protection values. This can be extended with
2193 Read-only data and Non transferrable data. Spec talks about MTP vendor extension range as well. Not used here. */
2194 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0);
2195 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 11, 1);
2196
2197 /* Set the length. */
2198 object_property_dataset_data_length = 18;
2199
2200 /* We could create this property. */
2201 status = UX_SUCCESS;
2202
2203 /* Done here. */
2204 break;
2205
2206 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE :
2207
2208 /* Add the property code. */
2209 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE);
2210
2211 /* Data type is UINT64. */
2212 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT64);
2213
2214 /* GetSet value is GET. */
2215 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2216
2217 /* Default value is UINT64. */
2218 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2219 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2220
2221 /* Group code is NULL. */
2222 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8, 0);
2223
2224 /* Form Flag is not used. */
2225 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 12) = 0;
2226
2227 /* Set the length. */
2228 object_property_dataset_data_length = 18;
2229
2230 /* We could create this property. */
2231 status = UX_SUCCESS;
2232
2233 /* Done here. */
2234 break;
2235
2236 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME :
2237
2238 /* Add the property code. */
2239 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME);
2240
2241 /* Data type is STRING. */
2242 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2243
2244 /* GetSet value is GETSET. */
2245 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2246
2247 /* Store a empty Unicode string. */
2248 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2249
2250 /* Group code is NULL. */
2251 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
2252
2253 /* Form Flag is not used. */
2254 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
2255
2256 /* Set the length. */
2257 object_property_dataset_data_length = 11;
2258
2259 /* We could create this property. */
2260 status = UX_SUCCESS;
2261
2262 /* Done here. */
2263 break;
2264
2265 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT :
2266
2267 /* Add the property code. */
2268 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT);
2269
2270 /* Data type is UINT32. */
2271 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2272
2273 /* GetSet value is GET. */
2274 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2275
2276 /* Default value is UINT32. */
2277 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2278
2279 /* Group code is NULL. */
2280 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2281
2282 /* Form Flag is not used. */
2283 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 0;
2284
2285 /* Set the length. */
2286 object_property_dataset_data_length = 14;
2287
2288 /* We could create this property. */
2289 status = UX_SUCCESS;
2290
2291 /* Done here. */
2292 break;
2293
2294
2295 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER :
2296
2297 /* Add the property code. */
2298 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER);
2299
2300 /* Data type is UINT128. */
2301 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT128);
2302
2303 /* GetSet value is GET. */
2304 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2305
2306 /* Default value is UINT128. */
2307 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2308 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2309 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8, 0);
2310 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 12, 0);
2311
2312 /* Group code is NULL. */
2313 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 16, 0);
2314
2315 /* Form Flag is not used. */
2316 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 20) = 0;
2317
2318 /* Set the length. */
2319 object_property_dataset_data_length = 26;
2320
2321 /* We could create this property. */
2322 status = UX_SUCCESS;
2323
2324 /* Done here. */
2325 break;
2326
2327
2328 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME :
2329
2330 /* Add the property code. */
2331 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME);
2332
2333 /* Data type is STRING. */
2334 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2335
2336 /* GetSet value is GETSET. */
2337 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2338
2339 /* Store a empty Unicode string. */
2340 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2341
2342 /* Group code is 2. */
2343 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 2);
2344
2345 /* Form Flag is not used. */
2346 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
2347
2348 /* Set the length. */
2349 object_property_dataset_data_length = 11;
2350
2351 /* We could create this property. */
2352 status = UX_SUCCESS;
2353
2354 /* Done here. */
2355 break;
2356
2357
2358 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE :
2359
2360 /* Add the property code. */
2361 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE);
2362
2363 /* Data type is UINT8. */
2364 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT8);
2365
2366 /* GetSet value is GET/SET. */
2367 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2368
2369 /* Default value is UINT8. */
2370 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2371
2372 /* Group code is 2. */
2373 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 2);
2374
2375 /* Form Flag ENUM. */
2376 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 2;
2377
2378 /* Number of elements in Enum array. */
2379 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 6, 2);
2380
2381 /* Elements in Enum array. */
2382 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 0;
2383 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9) = 1;
2384
2385 /* Set the length. */
2386 object_property_dataset_data_length = 15;
2387
2388 /* We could create this property. */
2389 status = UX_SUCCESS;
2390
2391 /* Done here. */
2392 break;
2393
2394
2395 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ARTIST :
2396
2397 /* Add the property code. */
2398 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ARTIST);
2399
2400 /* Data type is STRING. */
2401 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2402
2403 /* GetSet value is GETSET. */
2404 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2405
2406 /* Store a empty Unicode string. */
2407 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2408
2409 /* Group code is NULL. */
2410 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
2411
2412 /* Form Flag is not used. */
2413 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
2414
2415 /* Set the length. */
2416 object_property_dataset_data_length = 11;
2417
2418 /* We could create this property. */
2419 status = UX_SUCCESS;
2420
2421 /* Done here. */
2422 break;
2423
2424
2425 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_TRACK :
2426
2427 /* Add the property code. */
2428 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_TRACK);
2429
2430 /* Data type is UINT16. */
2431 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2432
2433 /* GetSet value is GET. */
2434 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2435
2436 /* Default value is UINT16. */
2437 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2438
2439 /* Group code is 3. */
2440 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 3);
2441
2442 /* Form Flag is not used. */
2443 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 6) = 0;
2444
2445 /* Set the length. */
2446 object_property_dataset_data_length = 12;
2447
2448 /* We could create this property. */
2449 status = UX_SUCCESS;
2450
2451 /* Done here. */
2452 break;
2453
2454
2455 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_USE_COUNT :
2456
2457 /* Add the property code. */
2458 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_USE_COUNT);
2459
2460 /* Data type is UINT32. */
2461 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2462
2463 /* GetSet value is GET/SET. */
2464 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2465
2466 /* Default value is UINT32. */
2467 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2468
2469 /* Group code is 1. */
2470 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2471
2472 /* Form Flag is not used. */
2473 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 0;
2474
2475 /* Set the length. */
2476 object_property_dataset_data_length = 14;
2477
2478 /* We could create this property. */
2479 status = UX_SUCCESS;
2480
2481 /* Done here. */
2482 break;
2483
2484
2485 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED :
2486
2487 /* Add the property code. */
2488 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED);
2489
2490 /* Data type is STRING. */
2491 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2492
2493 /* GetSet value is GETSET. */
2494 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2495
2496 /* Store a empty Unicode string. */
2497 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2498
2499 /* Group code is NULL. */
2500 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
2501
2502 /* Form Flag is 3. */
2503 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 3;
2504
2505 /* Set the length. */
2506 object_property_dataset_data_length = 11;
2507
2508 /* We could create this property. */
2509 status = UX_SUCCESS;
2510
2511 /* Done here. */
2512 break;
2513
2514 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE :
2515
2516 /* Add the property code. */
2517 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE);
2518
2519 /* Data type is STRING. */
2520 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2521
2522 /* GetSet value is GETSET. */
2523 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2524
2525 /* Store a empty Unicode string. */
2526 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2527
2528 /* Group code is NULL. */
2529 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
2530
2531 /* Form Flag is not used. */
2532 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
2533
2534 /* Set the length. */
2535 object_property_dataset_data_length = 11;
2536
2537 /* We could create this property. */
2538 status = UX_SUCCESS;
2539
2540 /* Done here. */
2541 break;
2542
2543 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_NAME :
2544
2545 /* Add the property code. */
2546 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_NAME);
2547
2548 /* Data type is STRING. */
2549 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2550
2551 /* GetSet value is GETSET. */
2552 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2553
2554 /* Store a empty Unicode string. */
2555 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2556
2557 /* Group code is NULL. */
2558 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
2559
2560 /* Form Flag is not used. */
2561 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
2562
2563 /* Set the length. */
2564 object_property_dataset_data_length = 11;
2565
2566 /* We could create this property. */
2567 status = UX_SUCCESS;
2568
2569 /* Done here. */
2570 break;
2571
2572 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST :
2573
2574 /* Add the property code. */
2575 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST);
2576
2577 /* Data type is STRING. */
2578 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
2579
2580 /* GetSet value is GETSET. */
2581 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2582
2583 /* Store a empty Unicode string. */
2584 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
2585
2586 /* Group code is NULL. */
2587 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
2588
2589 /* Form Flag is not used. */
2590 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
2591
2592 /* Set the length. */
2593 object_property_dataset_data_length = 11;
2594
2595 /* We could create this property. */
2596 status = UX_SUCCESS;
2597
2598 /* Done here. */
2599 break;
2600
2601
2602 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SAMPLE_RATE :
2603
2604 /* Add the property code. */
2605 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SAMPLE_RATE);
2606
2607 /* Data type is UINT32. */
2608 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2609
2610 /* GetSet value is GET. */
2611 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2612
2613 /* Default value is UINT32. */
2614 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2615
2616 /* Group code is 0. */
2617 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2618
2619 /* Form Flag RANGE. */
2620 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 1;
2621
2622 /* Minimum range in array is 0KHZ. */
2623 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x00000000);
2624
2625 /* Maximum range in array is KHZ. */
2626 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13,0x0002EE00 );
2627
2628 /* Range step size is 32HZ. */
2629 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 17,0x00000020 );
2630
2631 /* Set the length. */
2632 object_property_dataset_data_length = 26;
2633
2634 /* We could create this property. */
2635 status = UX_SUCCESS;
2636
2637 /* Done here. */
2638 break;
2639
2640
2641 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NUMBER_OF_CHANNELS :
2642
2643 /* Add the property code. */
2644 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NUMBER_OF_CHANNELS);
2645
2646 /* Data type is UINT16. */
2647 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2648
2649 /* GetSet value is GET. */
2650 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2651
2652 /* Default value is UINT16. */
2653 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2654
2655 /* Group code is 0. */
2656 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 0);
2657
2658 /* Form Flag ENUM. */
2659 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 6) = 2;
2660
2661 /* Number of elements in Enum array. */
2662 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 7, 3);
2663
2664 /* Elements in Enum array. */
2665 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0);
2666 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 11, 1);
2667 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13, 2);
2668
2669 /* Set the length. */
2670 object_property_dataset_data_length = 20;
2671
2672 /* We could create this property. */
2673 status = UX_SUCCESS;
2674
2675 /* Done here. */
2676 break;
2677
2678
2679 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_WAVE_CODEC :
2680
2681 /* Add the property code. */
2682 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_WAVE_CODEC);
2683
2684 /* Data type is UINT32. */
2685 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2686
2687 /* GetSet value is GET. */
2688 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2689
2690 /* Default value is UINT32. */
2691 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2692
2693 /* Group code is 0. */
2694 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2695
2696 /* Form Flag ENUM. */
2697 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 2;
2698
2699 /* Number of elements in Enum array. */
2700 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 3);
2701
2702 /* Elements in Enum array. */
2703 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 11, UX_TEST_AUDIO_CODEC_WAVE_FORMAT_MPEGLAYER3);
2704 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 15, UX_TEST_AUDIO_CODEC_WAVE_FORMAT_MPEG);
2705 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 19, UX_TEST_AUDIO_CODEC_WAVE_FORMAT_RAW_AAC1);
2706
2707 /* Set the length. */
2708 object_property_dataset_data_length = 28;
2709
2710 /* We could create this property. */
2711 status = UX_SUCCESS;
2712
2713 /* Done here. */
2714 break;
2715
2716 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_BITRATE :
2717
2718 /* Add the property code. */
2719 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_BITRATE);
2720
2721 /* Data type is UINT32. */
2722 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2723
2724 /* GetSet value is GET. */
2725 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2726
2727 /* Default value is UINT32. */
2728 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0x0000FA00);
2729
2730 /* Group code is 0. */
2731 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2732
2733 /* Form Flag RANGE. */
2734 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 1;
2735
2736 /* Minimum range in array is 1 bit per second. */
2737 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x00000001);
2738
2739 /* Maximum range in array is 1,500,000 bit per second. */
2740 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13,0x0016E360 );
2741
2742 /* Range step size is 1 bit per second. */
2743 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 17,0x00000001 );
2744
2745 /* Set the length. */
2746 object_property_dataset_data_length = 26;
2747
2748 /* We could create this property. */
2749 status = UX_SUCCESS;
2750
2751 /* Done here. */
2752 break;
2753
2754
2755 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DURATION :
2756
2757 /* Add the property code. */
2758 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DURATION);
2759
2760 /* Data type is UINT32. */
2761 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2762
2763 /* GetSet value is GET. */
2764 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2765
2766 /* Default value is UINT32. */
2767 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2768
2769 /* Group code is NULL. */
2770 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 0);
2771
2772 /* Form Flag is 1. */
2773 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 1;
2774
2775 /* Set the length. */
2776 object_property_dataset_data_length = 14;
2777
2778 /* We could create this property. */
2779 status = UX_SUCCESS;
2780
2781 /* Done here. */
2782 break;
2783
2784 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_WIDTH :
2785
2786 /* Add the property code. */
2787 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_WIDTH);
2788
2789 /* Data type is UINT16. */
2790 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2791
2792 /* GetSet value is GET. */
2793 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2794
2795 /* Default value is UINT16. */
2796 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0x0000);
2797
2798 /* Group code is 0. */
2799 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 0);
2800
2801 /* Form Flag RANGE. */
2802 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4) = 1;
2803
2804 /* Minimum range in array is customer defined. */
2805 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5, 0x0000);
2806
2807 /* Maximum range in array is customer defined. */
2808 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 7, 0x0000);
2809
2810 /* Range step size is customer defined. */
2811 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x0000);
2812
2813 /* Set the length. */
2814 object_property_dataset_data_length = 11;
2815
2816 /* We could create this property. */
2817 status = UX_SUCCESS;
2818
2819 /* Done here. */
2820 break;
2821
2822 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_HEIGHT :
2823
2824 /* Add the property code. */
2825 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_HEIGHT);
2826
2827 /* Data type is UINT16. */
2828 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2829
2830 /* GetSet value is GET. */
2831 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2832
2833 /* Default value is UINT16. */
2834 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0x0000);
2835
2836 /* Group code is 0. */
2837 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 0);
2838
2839 /* Form Flag RANGE. */
2840 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4) = 1;
2841
2842 /* Minimum range in array is customer defined. */
2843 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5, 0x0000);
2844
2845 /* Maximum range in array is customer defined. */
2846 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 7, 0x0000);
2847
2848 /* Range step size is customer defined. */
2849 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x0000);
2850
2851 /* Set the length. */
2852 object_property_dataset_data_length = 11;
2853
2854 /* We could create this property. */
2855 status = UX_SUCCESS;
2856
2857 /* Done here. */
2858 break;
2859
2860
2861 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SCAN_TYPE :
2862
2863 /* Add the property code. */
2864 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SCAN_TYPE);
2865
2866 /* Data type is UINT16. */
2867 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT16);
2868
2869 /* GetSet value is GET/SET. */
2870 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2871
2872 /* Default value is UINT16. */
2873 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2874
2875 /* Group code is 0. */
2876 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 2, 2);
2877
2878 /* Form Flag ENUM. */
2879 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 2;
2880
2881 /* Number of elements in Enum array. */
2882 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 7, 8);
2883
2884 /* Elements in Enum array. */
2885 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x0000);
2886 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 11, 0x0001);
2887 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13, 0x0002);
2888 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 15, 0x0003);
2889 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 17, 0x0004);
2890 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 19, 0x0005);
2891 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 21, 0x0006);
2892 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 23, 0x0007);
2893
2894 /* Set the length. */
2895 object_property_dataset_data_length = 29;
2896
2897 /* We could create this property. */
2898 status = UX_SUCCESS;
2899
2900 /* Done here. */
2901 break;
2902
2903 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_FOURCC_CODEC :
2904
2905 /* Add the property code. */
2906 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_FOURCC_CODEC);
2907
2908 /* Data type is UINT32. */
2909 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2910
2911 /* GetSet value is GET/SET. */
2912 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2913
2914 /* Default value is UINT32. */
2915 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2916
2917 /* Group code is 0. */
2918 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 2);
2919
2920 /* Form Flag ENUM. */
2921 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 2;
2922
2923 /* Number of elements in Enum array. */
2924 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 1);
2925
2926 /* Elements in Enum array. */
2927 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13, 0x00000000);
2928
2929 /* Set the length. */
2930 object_property_dataset_data_length = 22;
2931
2932 /* We could create this property. */
2933 status = UX_SUCCESS;
2934
2935 /* Done here. */
2936 break;
2937
2938 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_BITRATE :
2939
2940 /* Add the property code. */
2941 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_BITRATE);
2942
2943 /* Data type is UINT32. */
2944 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2945
2946 /* GetSet value is GET. */
2947 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GET;
2948
2949 /* Default value is UINT32. */
2950 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2951
2952 /* Group code is 0. */
2953 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 2);
2954
2955 /* Form Flag RANGE. */
2956 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 1;
2957
2958 /* Minimum range in array is 0. */
2959 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x00000000);
2960
2961 /* Maximum range in array is 0xFFFFFFFF. */
2962 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13,0xFFFFFFFF );
2963
2964 /* Range step size is 1. */
2965 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 17,0x00000001 );
2966
2967 /* Set the length. */
2968 object_property_dataset_data_length = 26;
2969
2970 /* We could create this property. */
2971 status = UX_SUCCESS;
2972
2973 /* Done here. */
2974 break;
2975
2976 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_FRAMES_PER_THOUSAND_SECONDS :
2977
2978 /* Add the property code. */
2979 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_FRAMES_PER_THOUSAND_SECONDS);
2980
2981 /* Data type is UINT32. */
2982 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
2983
2984 /* GetSet value is GET/SET. */
2985 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
2986
2987 /* Default value is UINT32. */
2988 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
2989
2990 /* Group code is 0. */
2991 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 2);
2992
2993 /* Form Flag ENUM. */
2994 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 2;
2995
2996 /* Number of elements in Enum array. */
2997 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 1);
2998
2999 /* Elements in Enum array. */
3000 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13, 0x00000000);
3001
3002 /* Set the length. */
3003 object_property_dataset_data_length = 22;
3004
3005 /* We could create this property. */
3006 status = UX_SUCCESS;
3007
3008 /* Done here. */
3009 break;
3010
3011 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_KEYFRAME_DISTANCE :
3012
3013 /* Add the property code. */
3014 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_KEYFRAME_DISTANCE);
3015
3016 /* Data type is UINT32. */
3017 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_UINT32);
3018
3019 /* GetSet value is GET/SET. */
3020 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
3021
3022 /* Default value is UINT32. */
3023 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE, 0);
3024
3025 /* Group code is 0. */
3026 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 4, 2);
3027
3028 /* Form Flag RANGE. */
3029 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 8) = 1;
3030
3031 /* Minimum range in array is 0. */
3032 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 9, 0x00000000);
3033
3034 /* Maximum range in array is FFFFFFFF. */
3035 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 13,0x0000FFFF );
3036
3037 /* Range step size is 1. */
3038 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 17,0x00000001 );
3039
3040 /* Set the length. */
3041 object_property_dataset_data_length = 26;
3042
3043 /* We could create this property. */
3044 status = UX_SUCCESS;
3045
3046 /* Done here. */
3047 break;
3048
3049 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ENCODING_PROFILE :
3050
3051 /* Add the property code. */
3052 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_CODE, UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ENCODING_PROFILE);
3053
3054 /* Data type is STRING. */
3055 ux_utility_short_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_DATATYPE, UX_DEVICE_CLASS_PIMA_TYPES_STR);
3056
3057 /* GetSet value is GETSET. */
3058 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_GETSET) = UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE_GETSET;
3059
3060 /* Store a empty Unicode string. */
3061 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE) = 0;
3062
3063 /* Group code is NULL. */
3064 ux_utility_long_put(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 1, 0);
3065
3066 /* Form Flag is not used. */
3067 *(object_property_dataset_data + UX_DEVICE_CLASS_PIMA_OBJECT_PROPERTY_DATASET_VALUE + 5) = 0;
3068
3069 /* Set the length. */
3070 object_property_dataset_data_length = 11;
3071
3072 /* We could create this property. */
3073 status = UX_SUCCESS;
3074
3075 /* Done here. */
3076 break;
3077
3078 default :
3079
3080 /* Error, prop code is not valid. */
3081 status = UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_PROP_CODE;
3082
3083 }
3084
3085 /* Check the status of the operation. */
3086 if (status == UX_SUCCESS)
3087 {
3088
3089 /* The property exist and its dataset created. Return its pointer to MTP. */
3090 *object_prop_dataset = object_property_dataset_data;
3091
3092 /* And the length of the dataset. */
3093 *object_prop_dataset_length = object_property_dataset_data_length;
3094
3095 /* Done here. */
3096 return(UX_SUCCESS);
3097 }
3098 else
3099
3100 /* Done here. Return error. */
3101 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_PROP_CODE);
3102
3103 break;
3104
3105 default :
3106
3107 /* We get here when we have the wrong format code. */
3108 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_FORMAT_CODE);
3109 }
3110
3111 }
3112
3113
pima_device_object_prop_value_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,ULONG object_property,UCHAR ** object_prop_value,ULONG * object_prop_value_length)3114 UINT pima_device_object_prop_value_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
3115 ULONG object_handle,
3116 ULONG object_property,
3117 UCHAR **object_prop_value,
3118 ULONG *object_prop_value_length)
3119 {
3120
3121 ULONG handle_index;
3122 UINT status;
3123 UCHAR *object_property_dataset_data;
3124 ULONG object_property_value_data_length;
3125 UX_SLAVE_CLASS_PIMA_OBJECT *object;
3126
3127 /* Check the object handle. It must be in the local array. */
3128 status = pima_device_object_handle_check(object_handle, &object, &handle_index);
3129
3130 /* Does the object handle exist ? */
3131 if (status == UX_SUCCESS)
3132 {
3133
3134 /* Set the pointer to the dataset_buffer. */
3135 object_property_dataset_data = pima_device_object_property_dataset_data_buffer;
3136
3137 /* Isolate the property. That will determine were we fetch the value. We use the dataset storage area to build the value. */
3138 switch (object_property)
3139 {
3140 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID :
3141
3142 /* Copy the value itself. */
3143 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_storage_id);
3144
3145 /* Set the length. */
3146 object_property_value_data_length = 4;
3147
3148 /* We could create this property. */
3149 status = UX_SUCCESS;
3150
3151 /* Done here. */
3152 break;
3153
3154 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT :
3155
3156 /* Copy the value itself. */
3157 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_format);
3158
3159 /* Set the length. */
3160 object_property_value_data_length = 2;
3161
3162 /* We could create this property. */
3163 status = UX_SUCCESS;
3164
3165 /* Done here. */
3166 break;
3167
3168 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PROTECTION_STATUS :
3169
3170 /* Copy the value itself. */
3171 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_protection_status);
3172
3173 /* Set the length. */
3174 object_property_value_data_length = 2;
3175
3176 /* We could create this property. */
3177 status = UX_SUCCESS;
3178
3179 /* Done here. */
3180 break;
3181
3182 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE :
3183
3184 /* Copy the value itself. */
3185 ux_utility_long_put(object_property_dataset_data , pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_size_low);
3186 ux_utility_long_put(object_property_dataset_data + 4, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_size_high);
3187
3188 /* Set the length. */
3189 object_property_value_data_length = 8;
3190
3191 /* We could create this property. */
3192 status = UX_SUCCESS;
3193
3194
3195 /* Done here. */
3196 break;
3197
3198 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME :
3199
3200 /* Store the file name in unicode format. */
3201 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_file_name, object_property_dataset_data);
3202
3203 /* Set the length. First Unicode string data. */
3204 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2 + 1;
3205
3206 /* Done here. */
3207 break;
3208
3209 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT :
3210
3211 /* Copy the value itself. */
3212 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_parent_object);
3213
3214 /* Set the length. */
3215 object_property_value_data_length = 4;
3216
3217 /* We could create this property. */
3218 status = UX_SUCCESS;
3219
3220 /* Done here. */
3221 break;
3222
3223 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PERSISTENT_UNIQUE_OBJECT_IDENTIFIER :
3224
3225 /* Copy the value itself. */
3226 ux_utility_memory_copy(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_persistent_unique_object_identifier,16);
3227
3228 /* Set the length. */
3229 object_property_value_data_length = 16;
3230
3231 /* We could create this property. */
3232 status = UX_SUCCESS;
3233
3234 /* Done here. */
3235 break;
3236
3237 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME :
3238
3239 /* Store the file name in unicode format. */
3240 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_name, object_property_dataset_data);
3241
3242 /* Set the length. First Unicode string data. */
3243 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2 + 1;
3244
3245 /* Done here. */
3246 break;
3247
3248 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NON_CONSUMABLE :
3249
3250 /* Copy the value itself. */
3251 *object_property_dataset_data = pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_non_consumable;
3252
3253 /* Set the length. */
3254 object_property_value_data_length = 1;
3255
3256 /* We could create this property. */
3257 status = UX_SUCCESS;
3258
3259 /* Done here. */
3260 break;
3261
3262 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ARTIST :
3263
3264 /* Store the file name in unicode format. */
3265 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_artist, object_property_dataset_data);
3266
3267 /* Set the length. First Unicode string data. */
3268 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2 + 1;
3269
3270 /* Done here. */
3271 break;
3272
3273 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_TRACK :
3274
3275 /* Copy the value itself. */
3276 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_track);
3277
3278 /* Set the length. */
3279 object_property_value_data_length = 2;
3280
3281 /* We could create this property. */
3282 status = UX_SUCCESS;
3283
3284 /* Done here. */
3285 break;
3286
3287 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_USE_COUNT :
3288
3289 /* Copy the value itself. */
3290 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_use_count);
3291
3292 /* Set the length. */
3293 object_property_value_data_length = 2;
3294
3295 /* We could create this property. */
3296 status = UX_SUCCESS;
3297
3298 /* Done here. */
3299 break;
3300
3301 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED :
3302
3303 /* Store the file name in unicode format. */
3304 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_date_authored, object_property_dataset_data);
3305
3306 /* Set the length. First Unicode string data. */
3307 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2 + 1;
3308
3309 /* Done here. */
3310 break;
3311
3312 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE :
3313
3314 /* Store the file name in unicode format. */
3315 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_genre, object_property_dataset_data);
3316
3317 /* Set the length. First Unicode string data. */
3318 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2 + 1;
3319
3320 /* Done here. */
3321 break;
3322
3323 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_NAME :
3324
3325 /* Store the file name in unicode format. */
3326 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_album_name, object_property_dataset_data);
3327
3328 /* Set the length. First Unicode string data. */
3329 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2 + 1;
3330
3331 /* Done here. */
3332 break;
3333
3334 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ALBUM_ARTIST :
3335
3336 /* Store the file name in unicode format. */
3337 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_album_artist, object_property_dataset_data);
3338
3339 /* Set the length. First Unicode string data. */
3340 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2 + 1;
3341
3342 /* Done here. */
3343 break;
3344
3345 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SAMPLE_RATE :
3346
3347 /* Copy the value itself. */
3348 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_sample_rate);
3349
3350 /* Set the length. */
3351 object_property_value_data_length = 2;
3352
3353 /* We could create this property. */
3354 status = UX_SUCCESS;
3355
3356 /* Done here. */
3357 break;
3358
3359 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NUMBER_OF_CHANNELS :
3360
3361 /* Copy the value itself. */
3362 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_number_of_channels);
3363
3364 /* Set the length. */
3365 object_property_value_data_length = 2;
3366
3367 /* We could create this property. */
3368 status = UX_SUCCESS;
3369
3370 /* Done here. */
3371 break;
3372
3373 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_WAVE_CODEC :
3374
3375 /* Copy the value itself. */
3376 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_audio_wave_codec);
3377
3378 /* Set the length. */
3379 object_property_value_data_length = 4;
3380
3381 /* We could create this property. */
3382 status = UX_SUCCESS;
3383
3384 /* Done here. */
3385 break;
3386
3387 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_AUDIO_BITRATE :
3388
3389 /* Copy the value itself. */
3390 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_audio_bitrate);
3391
3392 /* Set the length. */
3393 object_property_value_data_length = 4;
3394
3395 /* We could create this property. */
3396 status = UX_SUCCESS;
3397
3398 /* Done here. */
3399 break;
3400
3401 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DURATION :
3402
3403 /* Copy the value itself. */
3404 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_duration);
3405
3406 /* Set the length. */
3407 object_property_value_data_length = 4;
3408
3409 /* We could create this property. */
3410 status = UX_SUCCESS;
3411
3412 /* Done here. */
3413 break;
3414
3415 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_WIDTH :
3416
3417 /* Copy the value itself. */
3418 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_width);
3419
3420 /* Set the length. */
3421 object_property_value_data_length = 2;
3422
3423 /* We could create this property. */
3424 status = UX_SUCCESS;
3425
3426 /* Done here. */
3427 break;
3428
3429 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_HEIGHT :
3430
3431 /* Copy the value itself. */
3432 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_height);
3433
3434 /* Set the length. */
3435 object_property_value_data_length = 2;
3436
3437 /* We could create this property. */
3438 status = UX_SUCCESS;
3439
3440 /* Done here. */
3441 break;
3442
3443 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_SCAN_TYPE :
3444
3445 /* Copy the value itself. */
3446 ux_utility_short_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_scan_type);
3447
3448 /* Set the length. */
3449 object_property_value_data_length = 2;
3450
3451 /* We could create this property. */
3452 status = UX_SUCCESS;
3453
3454 /* Done here. */
3455 break;
3456
3457 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_FOURCC_CODEC :
3458
3459 /* Copy the value itself. */
3460 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_fourcc_codec);
3461
3462 /* Set the length. */
3463 object_property_value_data_length = 2;
3464
3465 /* We could create this property. */
3466 status = UX_SUCCESS;
3467
3468 /* Done here. */
3469 break;
3470
3471 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_VIDEO_BITRATE :
3472
3473 /* Copy the value itself. */
3474 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_video_bitrate);
3475
3476 /* Set the length. */
3477 object_property_value_data_length = 4;
3478
3479 /* We could create this property. */
3480 status = UX_SUCCESS;
3481
3482 /* Done here. */
3483 break;
3484
3485 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_FRAMES_PER_THOUSAND_SECONDS :
3486
3487 /* Copy the value itself. */
3488 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_frames_per_thousand_seconds);
3489
3490 /* Set the length. */
3491 object_property_value_data_length = 4;
3492
3493 /* We could create this property. */
3494 status = UX_SUCCESS;
3495
3496 /* Done here. */
3497 break;
3498
3499 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_KEYFRAME_DISTANCE :
3500
3501 /* Copy the value itself. */
3502 ux_utility_long_put(object_property_dataset_data, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_keyframe_distance);
3503
3504 /* Set the length. */
3505 object_property_value_data_length = 4;
3506
3507 /* We could create this property. */
3508 status = UX_SUCCESS;
3509
3510 /* Done here. */
3511 break;
3512
3513 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ENCODING_PROFILE :
3514
3515 /* Store the file name in unicode format. */
3516 ux_utility_string_to_unicode(pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_encoding_profile, object_property_dataset_data);
3517
3518 /* Set the length. First Unicode string data. */
3519 object_property_value_data_length = (ULONG) *(object_property_dataset_data) * 2 + 1;
3520
3521 /* Done here. */
3522 break;
3523
3524 default :
3525
3526 /* Error, prop code is not valid. */
3527 status = UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_PROP_CODE;
3528
3529 }
3530
3531 /* Check the status of the operation. */
3532 if (status == UX_SUCCESS)
3533 {
3534
3535 /* The property exist and its value created. Return its pointer to MTP. */
3536 *object_prop_value = object_property_dataset_data;
3537
3538 /* And the length of the dataset. */
3539 *object_prop_value_length = object_property_value_data_length;
3540
3541 /* Done here. */
3542 return(UX_SUCCESS);
3543 }
3544 else
3545
3546 /* Done here. Return error. */
3547 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_PROP_CODE);
3548 }
3549 else
3550
3551 /* Done here. Return error. */
3552 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
3553 }
3554
3555
pima_device_object_prop_value_set(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,ULONG object_property,UCHAR * object_prop_value,ULONG object_prop_value_length)3556 UINT pima_device_object_prop_value_set (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
3557 ULONG object_handle,
3558 ULONG object_property,
3559 UCHAR *object_prop_value,
3560 ULONG object_prop_value_length)
3561 {
3562
3563 ULONG handle_index;
3564 UINT status;
3565 UX_SLAVE_CLASS_PIMA_OBJECT *object;
3566
3567 /* Check the object handle. It must be in the local array. */
3568 status = pima_device_object_handle_check(object_handle, &object, &handle_index);
3569
3570 /* Does the object handle exist ? */
3571 if (status == UX_SUCCESS)
3572 {
3573
3574 /* Isolate the property. This is SET. So the properties that are GET only will not be changed. */
3575 switch (object_property)
3576 {
3577 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_STORAGEID :
3578 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FORMAT :
3579 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_SIZE :
3580 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_PARENT_OBJECT :
3581 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DURATION :
3582
3583 /* Object is write protected. */
3584 status = UX_DEVICE_CLASS_PIMA_RC_OBJECT_WRITE_PROTECTED;
3585
3586 /* Done here. */
3587 break;
3588
3589 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_OBJECT_FILE_NAME :
3590
3591 /* Copy the file name after translate from Unicode to ASCIIZ. */
3592 ux_utility_unicode_to_string(object_prop_value, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_object_file_name);
3593
3594 /* We could set this property. */
3595 status = UX_SUCCESS;
3596
3597 /* Done here. */
3598 break;
3599
3600 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_NAME :
3601
3602 /* Copy the name after translate from Unicode to ASCIIZ. */
3603 ux_utility_unicode_to_string(object_prop_value, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_name);
3604
3605 /* We could set this property. */
3606 status = UX_SUCCESS;
3607
3608 /* Done here. */
3609 break;
3610
3611 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_ARTIST :
3612
3613 /* Copy the artist name after translate from Unicode to ASCIIZ. */
3614 ux_utility_unicode_to_string(object_prop_value, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_artist);
3615
3616 /* We could set this property. */
3617 status = UX_SUCCESS;
3618
3619 break;
3620
3621 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_DATE_AUTHORED :
3622
3623 /* Copy the date authored after translate from Unicode to ASCIIZ. */
3624 ux_utility_unicode_to_string(object_prop_value, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_date_authored);
3625
3626 /* We could set this property. */
3627 status = UX_SUCCESS;
3628
3629 /* Done here. */
3630 break;
3631
3632 case UX_DEVICE_CLASS_PIMA_OBJECT_PROP_GENRE :
3633
3634 /* Copy the genre after translate from Unicode to ASCIIZ. */
3635 ux_utility_unicode_to_string(object_prop_value, pima_device_object_property_array[handle_index].test_pima_object_prop_dataset_genre);
3636
3637 /* We could set this property. */
3638 status = UX_SUCCESS;
3639
3640 /* Done here. */
3641 break;
3642
3643 default :
3644
3645 /* Error, prop code is not valid. */
3646 status = UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_PROP_CODE;
3647 }
3648
3649
3650 /* Done here. Return status. */
3651 return(status);
3652 }
3653 else
3654
3655 /* Done here. Return error. */
3656 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
3657 }
3658
3659
pima_device_object_references_get(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,UCHAR ** object_references_array,ULONG * object_references_array_length)3660 UINT pima_device_object_references_get (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
3661 ULONG object_handle,
3662 UCHAR **object_references_array,
3663 ULONG *object_references_array_length)
3664 {
3665
3666 ULONG handle_index;
3667 UINT status;
3668 UX_SLAVE_CLASS_PIMA_OBJECT *object;
3669 ULONG references_array;
3670
3671 /* Check the object handle. It must be in the local array. */
3672 status = pima_device_object_handle_check(object_handle, &object, &handle_index);
3673
3674 /* Does the object handle exist ? */
3675 if (status == UX_SUCCESS)
3676 {
3677
3678 /* The property exist. Not sure what to do with references in this release.
3679 Here we simply create an empty array. */
3680 references_array = 0;
3681
3682 /* Return its pointer to MTP. */
3683 *object_references_array = (UCHAR *) &references_array;
3684
3685 /* And the length of the dataset. */
3686 *object_references_array_length = sizeof(ULONG);
3687
3688 /* Done here. */
3689 return(UX_SUCCESS);
3690
3691 }
3692
3693 else
3694
3695 /* Done here. Return error. */
3696 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
3697 }
3698
3699
pima_device_object_references_set(struct UX_SLAVE_CLASS_PIMA_STRUCT * pima,ULONG object_handle,UCHAR * object_references_array,ULONG object_references_array_length)3700 UINT pima_device_object_references_set (struct UX_SLAVE_CLASS_PIMA_STRUCT *pima,
3701 ULONG object_handle,
3702 UCHAR *object_references_array,
3703 ULONG object_references_array_length)
3704 {
3705
3706 ULONG handle_index;
3707 UINT status;
3708 UX_SLAVE_CLASS_PIMA_OBJECT *object;
3709
3710 /* Check the object handle. It must be in the local array. */
3711 status = pima_device_object_handle_check(object_handle, &object, &handle_index);
3712
3713 /* Does the object handle exist ? */
3714 if (status == UX_SUCCESS)
3715 {
3716
3717 /* The property exist. Not sure what to do with references in this release. */
3718
3719 /* Done here. */
3720 return(UX_SUCCESS);
3721
3722 }
3723
3724 else
3725
3726 /* Done here. Return error. */
3727 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
3728 }
3729
3730
pima_device_object_handle_check(ULONG object_handle,UX_SLAVE_CLASS_PIMA_OBJECT ** object,ULONG * caller_handle_index)3731 UINT pima_device_object_handle_check(ULONG object_handle,
3732 UX_SLAVE_CLASS_PIMA_OBJECT **object,
3733 ULONG *caller_handle_index)
3734 {
3735 ULONG handle_index;
3736
3737 /* Parse all the handles we have in the media. */
3738 for (handle_index = 0; handle_index < UX_TEST_MAX_HANDLES; handle_index++)
3739 {
3740
3741 /* Check if we have the correct handle. */
3742 if (pima_device_object_number_handles_array[handle_index] == object_handle)
3743 {
3744
3745 /* We have found the right handle. Now retrieve its object info dataset. */
3746 *object = &pima_device_object_info_array[handle_index];
3747
3748 /* Update the caller index. */
3749 *caller_handle_index = handle_index;
3750
3751 /* We are done here. Return success. */
3752 return(UX_SUCCESS);
3753 }
3754 }
3755
3756 /* We get here when the handle is unknown. Return error. */
3757 return(UX_DEVICE_CLASS_PIMA_RC_INVALID_OBJECT_HANDLE);
3758
3759 }
3760