1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*
18  * Copyright (c) 2025, sakumisu
19  *
20  * SPDX-License-Identifier: Apache-2.0
21  */
22 #ifndef USB_MTP_H
23 #define USB_MTP_H
24 
25 // clang-format off
26 #define MTP_STANDARD_VERSION            100
27 
28 // Container Types
29 #define MTP_CONTAINER_TYPE_UNDEFINED    0
30 #define MTP_CONTAINER_TYPE_COMMAND      1
31 #define MTP_CONTAINER_TYPE_DATA         2
32 #define MTP_CONTAINER_TYPE_RESPONSE     3
33 #define MTP_CONTAINER_TYPE_EVENT        4
34 
35 // Container Offsets
36 #define MTP_CONTAINER_LENGTH_OFFSET             0
37 #define MTP_CONTAINER_TYPE_OFFSET               4
38 #define MTP_CONTAINER_CODE_OFFSET               6
39 #define MTP_CONTAINER_TRANSACTION_ID_OFFSET     8
40 #define MTP_CONTAINER_PARAMETER_OFFSET          12
41 #define MTP_CONTAINER_HEADER_SIZE               12
42 
43 // Maximum buffer size for a MTP packet.
44 #define MTP_BUFFER_SIZE 16384
45 
46 // MTP Data Types
47 #define MTP_TYPE_UNDEFINED      0x0000          // Undefined
48 #define MTP_TYPE_INT8           0x0001          // Signed 8-bit integer
49 #define MTP_TYPE_UINT8          0x0002          // Unsigned 8-bit integer
50 #define MTP_TYPE_INT16          0x0003          // Signed 16-bit integer
51 #define MTP_TYPE_UINT16         0x0004          // Unsigned 16-bit integer
52 #define MTP_TYPE_INT32          0x0005          // Signed 32-bit integer
53 #define MTP_TYPE_UINT32         0x0006          // Unsigned 32-bit integer
54 #define MTP_TYPE_INT64          0x0007          // Signed 64-bit integer
55 #define MTP_TYPE_UINT64         0x0008          // Unsigned 64-bit integer
56 #define MTP_TYPE_INT128         0x0009          // Signed 128-bit integer
57 #define MTP_TYPE_UINT128        0x000A          // Unsigned 128-bit integer
58 #define MTP_TYPE_AINT8          0x4001          // Array of signed 8-bit integers
59 #define MTP_TYPE_AUINT8         0x4002          // Array of unsigned 8-bit integers
60 #define MTP_TYPE_AINT16         0x4003          // Array of signed 16-bit integers
61 #define MTP_TYPE_AUINT16        0x4004          // Array of unsigned 16-bit integers
62 #define MTP_TYPE_AINT32         0x4005          // Array of signed 32-bit integers
63 #define MTP_TYPE_AUINT32        0x4006          // Array of unsigned 32-bit integers
64 #define MTP_TYPE_AINT64         0x4007          // Array of signed 64-bit integers
65 #define MTP_TYPE_AUINT64        0x4008          // Array of unsigned 64-bit integers
66 #define MTP_TYPE_AINT128        0x4009          // Array of signed 128-bit integers
67 #define MTP_TYPE_AUINT128       0x400A          // Array of unsigned 128-bit integers
68 #define MTP_TYPE_STR            0xFFFF          // Variable-length Unicode string
69 
70 // MTP Format Codes
71 #define MTP_FORMAT_UNDEFINED                            0x3000   // Undefined object
72 #define MTP_FORMAT_ASSOCIATION                          0x3001   // Association (for example, a folder)
73 #define MTP_FORMAT_SCRIPT                               0x3002   // Device model-specific script
74 #define MTP_FORMAT_EXECUTABLE                           0x3003   // Device model-specific binary executable
75 #define MTP_FORMAT_TEXT                                 0x3004   // Text file
76 #define MTP_FORMAT_HTML                                 0x3005   // Hypertext Markup Language file (text)
77 #define MTP_FORMAT_DPOF                                 0x3006   // Digital Print Order Format file (text)
78 #define MTP_FORMAT_AIFF                                 0x3007   // Audio clip
79 #define MTP_FORMAT_WAV                                  0x3008   // Audio clip
80 #define MTP_FORMAT_MP3                                  0x3009   // Audio clip
81 #define MTP_FORMAT_AVI                                  0x300A   // Video clip
82 #define MTP_FORMAT_MPEG                                 0x300B   // Video clip
83 #define MTP_FORMAT_ASF                                  0x300C   // Microsoft Advanced Streaming Format (video)
84 #define MTP_FORMAT_DEFINED                              0x3800   // Unknown image object
85 #define MTP_FORMAT_EXIF_JPEG                            0x3801   // Exchangeable File Format, JEIDA standard
86 #define MTP_FORMAT_TIFF_EP                              0x3802   // Tag Image File Format for Electronic Photography
87 #define MTP_FORMAT_FLASHPIX                             0x3803   // Structured Storage Image Format
88 #define MTP_FORMAT_BMP                                  0x3804   // Microsoft Windows Bitmap file
89 #define MTP_FORMAT_CIFF                                 0x3805   // Canon Camera Image File Format
90 #define MTP_FORMAT_GIF                                  0x3807   // Graphics Interchange Format
91 #define MTP_FORMAT_JFIF                                 0x3808   // JPEG File Interchange Format
92 #define MTP_FORMAT_CD                                   0x3809   // PhotoCD Image Pac
93 #define MTP_FORMAT_PICT                                 0x380A   // Quickdraw Image Format
94 #define MTP_FORMAT_PNG                                  0x380B   // Portable Network Graphics
95 #define MTP_FORMAT_TIFF                                 0x380D   // Tag Image File Format
96 #define MTP_FORMAT_TIFF_IT                              0x380E   // Tag Image File Format for Information Technology (graphic arts)
97 #define MTP_FORMAT_JP2                                  0x380F   // JPEG2000 Baseline File Format
98 #define MTP_FORMAT_JPX                                  0x3810   // JPEG2000 Extended File Format
99 #define MTP_FORMAT_DNG                                  0x3811   // Digital Negative
100 #define MTP_FORMAT_HEIF                                 0x3812   // HEIF images
101 #define MTP_FORMAT_UNDEFINED_FIRMWARE                   0xB802
102 #define MTP_FORMAT_WINDOWS_IMAGE_FORMAT                 0xB881
103 #define MTP_FORMAT_UNDEFINED_AUDIO                      0xB900
104 #define MTP_FORMAT_WMA                                  0xB901
105 #define MTP_FORMAT_OGG                                  0xB902
106 #define MTP_FORMAT_AAC                                  0xB903
107 #define MTP_FORMAT_AUDIBLE                              0xB904
108 #define MTP_FORMAT_FLAC                                 0xB906
109 #define MTP_FORMAT_UNDEFINED_VIDEO                      0xB980
110 #define MTP_FORMAT_WMV                                  0xB981
111 #define MTP_FORMAT_MP4_CONTAINER                        0xB982  // ISO 14496-1
112 #define MTP_FORMAT_MP2                                  0xB983
113 #define MTP_FORMAT_3GP_CONTAINER                        0xB984  // 3GPP file format. Details: http://www.3gpp.org/ftp/Specs/html-info/26244.htm (page title - \u201cTransparent end-to-end packet switched streaming service, 3GPP file format\u201d).
114 #define MTP_FORMAT_UNDEFINED_COLLECTION                 0xBA00
115 #define MTP_FORMAT_ABSTRACT_MULTIMEDIA_ALBUM            0xBA01
116 #define MTP_FORMAT_ABSTRACT_IMAGE_ALBUM                 0xBA02
117 #define MTP_FORMAT_ABSTRACT_AUDIO_ALBUM                 0xBA03
118 #define MTP_FORMAT_ABSTRACT_VIDEO_ALBUM                 0xBA04
119 #define MTP_FORMAT_ABSTRACT_AV_PLAYLIST                 0xBA05
120 #define MTP_FORMAT_ABSTRACT_CONTACT_GROUP               0xBA06
121 #define MTP_FORMAT_ABSTRACT_MESSAGE_FOLDER              0xBA07
122 #define MTP_FORMAT_ABSTRACT_CHAPTERED_PRODUCTION        0xBA08
123 #define MTP_FORMAT_ABSTRACT_AUDIO_PLAYLIST              0xBA09
124 #define MTP_FORMAT_ABSTRACT_VIDEO_PLAYLIST              0xBA0A
125 #define MTP_FORMAT_ABSTRACT_MEDIACAST                   0xBA0B // For use with mediacasts; references multimedia enclosures of RSS feeds or episodic content
126 #define MTP_FORMAT_WPL_PLAYLIST                         0xBA10
127 #define MTP_FORMAT_M3U_PLAYLIST                         0xBA11
128 #define MTP_FORMAT_MPL_PLAYLIST                         0xBA12
129 #define MTP_FORMAT_ASX_PLAYLIST                         0xBA13
130 #define MTP_FORMAT_PLS_PLAYLIST                         0xBA14
131 #define MTP_FORMAT_UNDEFINED_DOCUMENT                   0xBA80
132 #define MTP_FORMAT_ABSTRACT_DOCUMENT                    0xBA81
133 #define MTP_FORMAT_XML_DOCUMENT                         0xBA82
134 #define MTP_FORMAT_MS_WORD_DOCUMENT                     0xBA83
135 #define MTP_FORMAT_MHT_COMPILED_HTML_DOCUMENT           0xBA84
136 #define MTP_FORMAT_MS_EXCEL_SPREADSHEET                 0xBA85
137 #define MTP_FORMAT_MS_POWERPOINT_PRESENTATION           0xBA86
138 #define MTP_FORMAT_UNDEFINED_MESSAGE                    0xBB00
139 #define MTP_FORMAT_ABSTRACT_MESSSAGE                    0xBB01
140 #define MTP_FORMAT_UNDEFINED_CONTACT                    0xBB80
141 #define MTP_FORMAT_ABSTRACT_CONTACT                     0xBB81
142 #define MTP_FORMAT_VCARD_2                              0xBB82
143 
144 // MTP Object Property Codes
145 #define MTP_PROPERTY_STORAGE_ID                             0xDC01
146 #define MTP_PROPERTY_OBJECT_FORMAT                          0xDC02
147 #define MTP_PROPERTY_PROTECTION_STATUS                      0xDC03
148 #define MTP_PROPERTY_OBJECT_SIZE                            0xDC04
149 #define MTP_PROPERTY_ASSOCIATION_TYPE                       0xDC05
150 #define MTP_PROPERTY_ASSOCIATION_DESC                       0xDC06
151 #define MTP_PROPERTY_OBJECT_FILE_NAME                       0xDC07
152 #define MTP_PROPERTY_DATE_CREATED                           0xDC08
153 #define MTP_PROPERTY_DATE_MODIFIED                          0xDC09
154 #define MTP_PROPERTY_KEYWORDS                               0xDC0A
155 #define MTP_PROPERTY_PARENT_OBJECT                          0xDC0B
156 #define MTP_PROPERTY_ALLOWED_FOLDER_CONTENTS                0xDC0C
157 #define MTP_PROPERTY_HIDDEN                                 0xDC0D
158 #define MTP_PROPERTY_SYSTEM_OBJECT                          0xDC0E
159 #define MTP_PROPERTY_PERSISTENT_UID                         0xDC41
160 #define MTP_PROPERTY_SYNC_ID                                0xDC42
161 #define MTP_PROPERTY_PROPERTY_BAG                           0xDC43
162 #define MTP_PROPERTY_NAME                                   0xDC44
163 #define MTP_PROPERTY_CREATED_BY                             0xDC45
164 #define MTP_PROPERTY_ARTIST                                 0xDC46
165 #define MTP_PROPERTY_DATE_AUTHORED                          0xDC47
166 #define MTP_PROPERTY_DESCRIPTION                            0xDC48
167 #define MTP_PROPERTY_URL_REFERENCE                          0xDC49
168 #define MTP_PROPERTY_LANGUAGE_LOCALE                        0xDC4A
169 #define MTP_PROPERTY_COPYRIGHT_INFORMATION                  0xDC4B
170 #define MTP_PROPERTY_SOURCE                                 0xDC4C
171 #define MTP_PROPERTY_ORIGIN_LOCATION                        0xDC4D
172 #define MTP_PROPERTY_DATE_ADDED                             0xDC4E
173 #define MTP_PROPERTY_NON_CONSUMABLE                         0xDC4F
174 #define MTP_PROPERTY_CORRUPT_UNPLAYABLE                     0xDC50
175 #define MTP_PROPERTY_PRODUCER_SERIAL_NUMBER                 0xDC51
176 #define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_FORMAT           0xDC81
177 #define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_SIZE             0xDC82
178 #define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_HEIGHT           0xDC83
179 #define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_WIDTH            0xDC84
180 #define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DURATION         0xDC85
181 #define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DATA             0xDC86
182 #define MTP_PROPERTY_WIDTH                                  0xDC87
183 #define MTP_PROPERTY_HEIGHT                                 0xDC88
184 #define MTP_PROPERTY_DURATION                               0xDC89
185 #define MTP_PROPERTY_RATING                                 0xDC8A
186 #define MTP_PROPERTY_TRACK                                  0xDC8B
187 #define MTP_PROPERTY_GENRE                                  0xDC8C
188 #define MTP_PROPERTY_CREDITS                                0xDC8D
189 #define MTP_PROPERTY_LYRICS                                 0xDC8E
190 #define MTP_PROPERTY_SUBSCRIPTION_CONTENT_ID                0xDC8F
191 #define MTP_PROPERTY_PRODUCED_BY                            0xDC90
192 #define MTP_PROPERTY_USE_COUNT                              0xDC91
193 #define MTP_PROPERTY_SKIP_COUNT                             0xDC92
194 #define MTP_PROPERTY_LAST_ACCESSED                          0xDC93
195 #define MTP_PROPERTY_PARENTAL_RATING                        0xDC94
196 #define MTP_PROPERTY_META_GENRE                             0xDC95
197 #define MTP_PROPERTY_COMPOSER                               0xDC96
198 #define MTP_PROPERTY_EFFECTIVE_RATING                       0xDC97
199 #define MTP_PROPERTY_SUBTITLE                               0xDC98
200 #define MTP_PROPERTY_ORIGINAL_RELEASE_DATE                  0xDC99
201 #define MTP_PROPERTY_ALBUM_NAME                             0xDC9A
202 #define MTP_PROPERTY_ALBUM_ARTIST                           0xDC9B
203 #define MTP_PROPERTY_MOOD                                   0xDC9C
204 #define MTP_PROPERTY_DRM_STATUS                             0xDC9D
205 #define MTP_PROPERTY_SUB_DESCRIPTION                        0xDC9E
206 #define MTP_PROPERTY_IS_CROPPED                             0xDCD1
207 #define MTP_PROPERTY_IS_COLOUR_CORRECTED                    0xDCD2
208 #define MTP_PROPERTY_IMAGE_BIT_DEPTH                        0xDCD3
209 #define MTP_PROPERTY_F_NUMBER                               0xDCD4
210 #define MTP_PROPERTY_EXPOSURE_TIME                          0xDCD5
211 #define MTP_PROPERTY_EXPOSURE_INDEX                         0xDCD6
212 #define MTP_PROPERTY_TOTAL_BITRATE                          0xDE91
213 #define MTP_PROPERTY_BITRATE_TYPE                           0xDE92
214 #define MTP_PROPERTY_SAMPLE_RATE                            0xDE93
215 #define MTP_PROPERTY_NUMBER_OF_CHANNELS                     0xDE94
216 #define MTP_PROPERTY_AUDIO_BIT_DEPTH                        0xDE95
217 #define MTP_PROPERTY_SCAN_TYPE                              0xDE97
218 #define MTP_PROPERTY_AUDIO_WAVE_CODEC                       0xDE99
219 #define MTP_PROPERTY_AUDIO_BITRATE                          0xDE9A
220 #define MTP_PROPERTY_VIDEO_FOURCC_CODEC                     0xDE9B
221 #define MTP_PROPERTY_VIDEO_BITRATE                          0xDE9C
222 #define MTP_PROPERTY_FRAMES_PER_THOUSAND_SECONDS            0xDE9D
223 #define MTP_PROPERTY_KEYFRAME_DISTANCE                      0xDE9E
224 #define MTP_PROPERTY_BUFFER_SIZE                            0xDE9F
225 #define MTP_PROPERTY_ENCODING_QUALITY                       0xDEA0
226 #define MTP_PROPERTY_ENCODING_PROFILE                       0xDEA1
227 #define MTP_PROPERTY_DISPLAY_NAME                           0xDCE0
228 #define MTP_PROPERTY_BODY_TEXT                              0xDCE1
229 #define MTP_PROPERTY_SUBJECT                                0xDCE2
230 #define MTP_PROPERTY_PRIORITY                               0xDCE3
231 #define MTP_PROPERTY_GIVEN_NAME                             0xDD00
232 #define MTP_PROPERTY_MIDDLE_NAMES                           0xDD01
233 #define MTP_PROPERTY_FAMILY_NAME                            0xDD02
234 #define MTP_PROPERTY_PREFIX                                 0xDD03
235 #define MTP_PROPERTY_SUFFIX                                 0xDD04
236 #define MTP_PROPERTY_PHONETIC_GIVEN_NAME                    0xDD05
237 #define MTP_PROPERTY_PHONETIC_FAMILY_NAME                   0xDD06
238 #define MTP_PROPERTY_EMAIL_PRIMARY                          0xDD07
239 #define MTP_PROPERTY_EMAIL_PERSONAL_1                       0xDD08
240 #define MTP_PROPERTY_EMAIL_PERSONAL_2                       0xDD09
241 #define MTP_PROPERTY_EMAIL_BUSINESS_1                       0xDD0A
242 #define MTP_PROPERTY_EMAIL_BUSINESS_2                       0xDD0B
243 #define MTP_PROPERTY_EMAIL_OTHERS                           0xDD0C
244 #define MTP_PROPERTY_PHONE_NUMBER_PRIMARY                   0xDD0D
245 #define MTP_PROPERTY_PHONE_NUMBER_PERSONAL                  0xDD0E
246 #define MTP_PROPERTY_PHONE_NUMBER_PERSONAL_2                0xDD0F
247 #define MTP_PROPERTY_PHONE_NUMBER_BUSINESS                  0xDD10
248 #define MTP_PROPERTY_PHONE_NUMBER_BUSINESS_2                0xDD11
249 #define MTP_PROPERTY_PHONE_NUMBER_MOBILE                    0xDD12
250 #define MTP_PROPERTY_PHONE_NUMBER_MOBILE_2                  0xDD13
251 #define MTP_PROPERTY_FAX_NUMBER_PRIMARY                     0xDD14
252 #define MTP_PROPERTY_FAX_NUMBER_PERSONAL                    0xDD15
253 #define MTP_PROPERTY_FAX_NUMBER_BUSINESS                    0xDD16
254 #define MTP_PROPERTY_PAGER_NUMBER                           0xDD17
255 #define MTP_PROPERTY_PHONE_NUMBER_OTHERS                    0xDD18
256 #define MTP_PROPERTY_PRIMARY_WEB_ADDRESS                    0xDD19
257 #define MTP_PROPERTY_PERSONAL_WEB_ADDRESS                   0xDD1A
258 #define MTP_PROPERTY_BUSINESS_WEB_ADDRESS                   0xDD1B
259 #define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS              0xDD1C
260 #define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_2            0xDD1D
261 #define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_3            0xDD1E
262 #define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_FULL           0xDD1F
263 #define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_1         0xDD20
264 #define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_2         0xDD21
265 #define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_CITY           0xDD22
266 #define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_REGION         0xDD23
267 #define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_POSTAL_CODE    0xDD24
268 #define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_COUNTRY        0xDD25
269 #define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_FULL           0xDD26
270 #define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_1         0xDD27
271 #define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_2         0xDD28
272 #define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_CITY           0xDD29
273 #define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_REGION         0xDD2A
274 #define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_POSTAL_CODE    0xDD2B
275 #define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_COUNTRY        0xDD2C
276 #define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_FULL              0xDD2D
277 #define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_1            0xDD2E
278 #define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_2            0xDD2F
279 #define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_CITY              0xDD30
280 #define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_REGION            0xDD31
281 #define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_POSTAL_CODE       0xDD32
282 #define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_COUNTRY           0xDD33
283 #define MTP_PROPERTY_ORGANIZATION_NAME                      0xDD34
284 #define MTP_PROPERTY_PHONETIC_ORGANIZATION_NAME             0xDD35
285 #define MTP_PROPERTY_ROLE                                   0xDD36
286 #define MTP_PROPERTY_BIRTHDATE                              0xDD37
287 #define MTP_PROPERTY_MESSAGE_TO                             0xDD40
288 #define MTP_PROPERTY_MESSAGE_CC                             0xDD41
289 #define MTP_PROPERTY_MESSAGE_BCC                            0xDD42
290 #define MTP_PROPERTY_MESSAGE_READ                           0xDD43
291 #define MTP_PROPERTY_MESSAGE_RECEIVED_TIME                  0xDD44
292 #define MTP_PROPERTY_MESSAGE_SENDER                         0xDD45
293 #define MTP_PROPERTY_ACTIVITY_BEGIN_TIME                    0xDD50
294 #define MTP_PROPERTY_ACTIVITY_END_TIME                      0xDD51
295 #define MTP_PROPERTY_ACTIVITY_LOCATION                      0xDD52
296 #define MTP_PROPERTY_ACTIVITY_REQUIRED_ATTENDEES            0xDD54
297 #define MTP_PROPERTY_ACTIVITY_OPTIONAL_ATTENDEES            0xDD55
298 #define MTP_PROPERTY_ACTIVITY_RESOURCES                     0xDD56
299 #define MTP_PROPERTY_ACTIVITY_ACCEPTED                      0xDD57
300 #define MTP_PROPERTY_ACTIVITY_TENTATIVE                     0xDD58
301 #define MTP_PROPERTY_ACTIVITY_DECLINED                      0xDD59
302 #define MTP_PROPERTY_ACTIVITY_REMAINDER_TIME                0xDD5A
303 #define MTP_PROPERTY_ACTIVITY_OWNER                         0xDD5B
304 #define MTP_PROPERTY_ACTIVITY_STATUS                        0xDD5C
305 #define MTP_PROPERTY_OWNER                                  0xDD5D
306 #define MTP_PROPERTY_EDITOR                                 0xDD5E
307 #define MTP_PROPERTY_WEBMASTER                              0xDD5F
308 #define MTP_PROPERTY_URL_SOURCE                             0xDD60
309 #define MTP_PROPERTY_URL_DESTINATION                        0xDD61
310 #define MTP_PROPERTY_TIME_BOOKMARK                          0xDD62
311 #define MTP_PROPERTY_OBJECT_BOOKMARK                        0xDD63
312 #define MTP_PROPERTY_BYTE_BOOKMARK                          0xDD64
313 #define MTP_PROPERTY_LAST_BUILD_DATE                        0xDD70
314 #define MTP_PROPERTY_TIME_TO_LIVE                           0xDD71
315 #define MTP_PROPERTY_MEDIA_GUID                             0xDD72
316 
317 // MTP Device Property Codes
318 #define MTP_DEVICE_PROPERTY_UNDEFINED                       0x5000
319 #define MTP_DEVICE_PROPERTY_BATTERY_LEVEL                   0x5001
320 #define MTP_DEVICE_PROPERTY_FUNCTIONAL_MODE                 0x5002
321 #define MTP_DEVICE_PROPERTY_IMAGE_SIZE                      0x5003
322 #define MTP_DEVICE_PROPERTY_COMPRESSION_SETTING             0x5004
323 #define MTP_DEVICE_PROPERTY_WHITE_BALANCE                   0x5005
324 #define MTP_DEVICE_PROPERTY_RGB_GAIN                        0x5006
325 #define MTP_DEVICE_PROPERTY_F_NUMBER                        0x5007
326 #define MTP_DEVICE_PROPERTY_FOCAL_LENGTH                    0x5008
327 #define MTP_DEVICE_PROPERTY_FOCUS_DISTANCE                  0x5009
328 #define MTP_DEVICE_PROPERTY_FOCUS_MODE                      0x500A
329 #define MTP_DEVICE_PROPERTY_EXPOSURE_METERING_MODE          0x500B
330 #define MTP_DEVICE_PROPERTY_FLASH_MODE                      0x500C
331 #define MTP_DEVICE_PROPERTY_EXPOSURE_TIME                   0x500D
332 #define MTP_DEVICE_PROPERTY_EXPOSURE_PROGRAM_MODE           0x500E
333 #define MTP_DEVICE_PROPERTY_EXPOSURE_INDEX                  0x500F
334 #define MTP_DEVICE_PROPERTY_EXPOSURE_BIAS_COMPENSATION      0x5010
335 #define MTP_DEVICE_PROPERTY_DATETIME                        0x5011
336 #define MTP_DEVICE_PROPERTY_CAPTURE_DELAY                   0x5012
337 #define MTP_DEVICE_PROPERTY_STILL_CAPTURE_MODE              0x5013
338 #define MTP_DEVICE_PROPERTY_CONTRAST                        0x5014
339 #define MTP_DEVICE_PROPERTY_SHARPNESS                       0x5015
340 #define MTP_DEVICE_PROPERTY_DIGITAL_ZOOM                    0x5016
341 #define MTP_DEVICE_PROPERTY_EFFECT_MODE                     0x5017
342 #define MTP_DEVICE_PROPERTY_BURST_NUMBER                    0x5018
343 #define MTP_DEVICE_PROPERTY_BURST_INTERVAL                  0x5019
344 #define MTP_DEVICE_PROPERTY_TIMELAPSE_NUMBER                0x501A
345 #define MTP_DEVICE_PROPERTY_TIMELAPSE_INTERVAL              0x501B
346 #define MTP_DEVICE_PROPERTY_FOCUS_METERING_MODE             0x501C
347 #define MTP_DEVICE_PROPERTY_UPLOAD_URL                      0x501D
348 #define MTP_DEVICE_PROPERTY_ARTIST                          0x501E
349 #define MTP_DEVICE_PROPERTY_COPYRIGHT_INFO                  0x501F
350 #define MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER         0xD401
351 #define MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME            0xD402
352 #define MTP_DEVICE_PROPERTY_VOLUME                          0xD403
353 #define MTP_DEVICE_PROPERTY_SUPPORTED_FORMATS_ORDERED       0xD404
354 #define MTP_DEVICE_PROPERTY_DEVICE_ICON                     0xD405
355 #define MTP_DEVICE_PROPERTY_PLAYBACK_RATE                   0xD410
356 #define MTP_DEVICE_PROPERTY_PLAYBACK_OBJECT                 0xD411
357 #define MTP_DEVICE_PROPERTY_PLAYBACK_CONTAINER_INDEX        0xD412
358 #define MTP_DEVICE_PROPERTY_SESSION_INITIATOR_VERSION_INFO  0xD406
359 #define MTP_DEVICE_PROPERTY_PERCEIVED_DEVICE_TYPE           0xD407
360 
361 // MTP Operation Codes
362 #define MTP_OPERATION_GET_DEVICE_INFO                       0x1001
363 #define MTP_OPERATION_OPEN_SESSION                          0x1002
364 #define MTP_OPERATION_CLOSE_SESSION                         0x1003
365 #define MTP_OPERATION_GET_STORAGE_IDS                       0x1004
366 #define MTP_OPERATION_GET_STORAGE_INFO                      0x1005
367 #define MTP_OPERATION_GET_NUM_OBJECTS                       0x1006
368 #define MTP_OPERATION_GET_OBJECT_HANDLES                    0x1007
369 #define MTP_OPERATION_GET_OBJECT_INFO                       0x1008
370 #define MTP_OPERATION_GET_OBJECT                            0x1009
371 #define MTP_OPERATION_GET_THUMB                             0x100A
372 #define MTP_OPERATION_DELETE_OBJECT                         0x100B
373 #define MTP_OPERATION_SEND_OBJECT_INFO                      0x100C
374 #define MTP_OPERATION_SEND_OBJECT                           0x100D
375 #define MTP_OPERATION_INITIATE_CAPTURE                      0x100E
376 #define MTP_OPERATION_FORMAT_STORE                          0x100F
377 #define MTP_OPERATION_RESET_DEVICE                          0x1010
378 #define MTP_OPERATION_SELF_TEST                             0x1011
379 #define MTP_OPERATION_SET_OBJECT_PROTECTION                 0x1012
380 #define MTP_OPERATION_POWER_DOWN                            0x1013
381 #define MTP_OPERATION_GET_DEVICE_PROP_DESC                  0x1014
382 #define MTP_OPERATION_GET_DEVICE_PROP_VALUE                 0x1015
383 #define MTP_OPERATION_SET_DEVICE_PROP_VALUE                 0x1016
384 #define MTP_OPERATION_RESET_DEVICE_PROP_VALUE               0x1017
385 #define MTP_OPERATION_TERMINATE_OPEN_CAPTURE                0x1018
386 #define MTP_OPERATION_MOVE_OBJECT                           0x1019
387 #define MTP_OPERATION_COPY_OBJECT                           0x101A
388 #define MTP_OPERATION_GET_PARTIAL_OBJECT                    0x101B
389 #define MTP_OPERATION_INITIATE_OPEN_CAPTURE                 0x101C
390 #define MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED            0x9801
391 #define MTP_OPERATION_GET_OBJECT_PROP_DESC                  0x9802
392 #define MTP_OPERATION_GET_OBJECT_PROP_VALUE                 0x9803
393 #define MTP_OPERATION_SET_OBJECT_PROP_VALUE                 0x9804
394 #define MTP_OPERATION_GET_OBJECT_PROP_LIST                  0x9805
395 #define MTP_OPERATION_SET_OBJECT_PROP_LIST                  0x9806
396 #define MTP_OPERATION_GET_INTERDEPENDENT_PROP_DESC          0x9807
397 #define MTP_OPERATION_SEND_OBJECT_PROP_LIST                 0x9808
398 #define MTP_OPERATION_GET_OBJECT_REFERENCES                 0x9810
399 #define MTP_OPERATION_SET_OBJECT_REFERENCES                 0x9811
400 #define MTP_OPERATION_SKIP                                  0x9820
401 
402 // Android extensions for direct file IO
403 
404 // Same as GetPartialObject, but with 64 bit offset
405 #define MTP_OPERATION_GET_PARTIAL_OBJECT_64                 0x95C1
406 // Same as GetPartialObject64, but copying host to device
407 #define MTP_OPERATION_SEND_PARTIAL_OBJECT                   0x95C2
408 // Truncates file to 64 bit length
409 #define MTP_OPERATION_TRUNCATE_OBJECT                       0x95C3
410 // Must be called before using SendPartialObject and TruncateObject
411 #define MTP_OPERATION_BEGIN_EDIT_OBJECT                     0x95C4
412 // Called to commit changes made by SendPartialObject and TruncateObject
413 #define MTP_OPERATION_END_EDIT_OBJECT                       0x95C5
414 
415 // MTP Response Codes
416 #define MTP_RESPONSE_UNDEFINED                                  0x2000
417 #define MTP_RESPONSE_OK                                         0x2001
418 #define MTP_RESPONSE_GENERAL_ERROR                              0x2002
419 #define MTP_RESPONSE_SESSION_NOT_OPEN                           0x2003
420 #define MTP_RESPONSE_INVALID_TRANSACTION_ID                     0x2004
421 #define MTP_RESPONSE_OPERATION_NOT_SUPPORTED                    0x2005
422 #define MTP_RESPONSE_PARAMETER_NOT_SUPPORTED                    0x2006
423 #define MTP_RESPONSE_INCOMPLETE_TRANSFER                        0x2007
424 #define MTP_RESPONSE_INVALID_STORAGE_ID                         0x2008
425 #define MTP_RESPONSE_INVALID_OBJECT_HANDLE                      0x2009
426 #define MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED                  0x200A
427 #define MTP_RESPONSE_INVALID_OBJECT_FORMAT_CODE                 0x200B
428 #define MTP_RESPONSE_STORAGE_FULL                               0x200C
429 #define MTP_RESPONSE_OBJECT_WRITE_PROTECTED                     0x200D
430 #define MTP_RESPONSE_STORE_READ_ONLY                            0x200E
431 #define MTP_RESPONSE_ACCESS_DENIED                              0x200F
432 #define MTP_RESPONSE_NO_THUMBNAIL_PRESENT                       0x2010
433 #define MTP_RESPONSE_SELF_TEST_FAILED                           0x2011
434 #define MTP_RESPONSE_PARTIAL_DELETION                           0x2012
435 #define MTP_RESPONSE_STORE_NOT_AVAILABLE                        0x2013
436 #define MTP_RESPONSE_SPECIFICATION_BY_FORMAT_UNSUPPORTED        0x2014
437 #define MTP_RESPONSE_NO_VALID_OBJECT_INFO                       0x2015
438 #define MTP_RESPONSE_INVALID_CODE_FORMAT                        0x2016
439 #define MTP_RESPONSE_UNKNOWN_VENDOR_CODE                        0x2017
440 #define MTP_RESPONSE_CAPTURE_ALREADY_TERMINATED                 0x2018
441 #define MTP_RESPONSE_DEVICE_BUSY                                0x2019
442 #define MTP_RESPONSE_INVALID_PARENT_OBJECT                      0x201A
443 #define MTP_RESPONSE_INVALID_DEVICE_PROP_FORMAT                 0x201B
444 #define MTP_RESPONSE_INVALID_DEVICE_PROP_VALUE                  0x201C
445 #define MTP_RESPONSE_INVALID_PARAMETER                          0x201D
446 #define MTP_RESPONSE_SESSION_ALREADY_OPEN                       0x201E
447 #define MTP_RESPONSE_TRANSACTION_CANCELLED                      0x201F
448 #define MTP_RESPONSE_SPECIFICATION_OF_DESTINATION_UNSUPPORTED   0x2020
449 #define MTP_RESPONSE_INVALID_OBJECT_PROP_CODE                   0xA801
450 #define MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT                 0xA802
451 #define MTP_RESPONSE_INVALID_OBJECT_PROP_VALUE                  0xA803
452 #define MTP_RESPONSE_INVALID_OBJECT_REFERENCE                   0xA804
453 #define MTP_RESPONSE_GROUP_NOT_SUPPORTED                        0xA805
454 #define MTP_RESPONSE_INVALID_DATASET                            0xA806
455 #define MTP_RESPONSE_SPECIFICATION_BY_GROUP_UNSUPPORTED         0xA807
456 #define MTP_RESPONSE_SPECIFICATION_BY_DEPTH_UNSUPPORTED         0xA808
457 #define MTP_RESPONSE_OBJECT_TOO_LARGE                           0xA809
458 #define MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED                  0xA80A
459 #define MTP_RESPONSE_NO_RESPONSE                                0xFFFF
460 
461 // MTP Event Codes
462 #define MTP_EVENT_UNDEFINED                         0x4000
463 #define MTP_EVENT_CANCEL_TRANSACTION                0x4001
464 #define MTP_EVENT_OBJECT_ADDED                      0x4002
465 #define MTP_EVENT_OBJECT_REMOVED                    0x4003
466 #define MTP_EVENT_STORE_ADDED                       0x4004
467 #define MTP_EVENT_STORE_REMOVED                     0x4005
468 #define MTP_EVENT_DEVICE_PROP_CHANGED               0x4006
469 #define MTP_EVENT_OBJECT_INFO_CHANGED               0x4007
470 #define MTP_EVENT_DEVICE_INFO_CHANGED               0x4008
471 #define MTP_EVENT_REQUEST_OBJECT_TRANSFER           0x4009
472 #define MTP_EVENT_STORE_FULL                        0x400A
473 #define MTP_EVENT_DEVICE_RESET                      0x400B
474 #define MTP_EVENT_STORAGE_INFO_CHANGED              0x400C
475 #define MTP_EVENT_CAPTURE_COMPLETE                  0x400D
476 #define MTP_EVENT_UNREPORTED_STATUS                 0x400E
477 #define MTP_EVENT_OBJECT_PROP_CHANGED               0xC801
478 #define MTP_EVENT_OBJECT_PROP_DESC_CHANGED          0xC802
479 #define MTP_EVENT_OBJECT_REFERENCES_CHANGED         0xC803
480 
481 // Storage Type
482 #define MTP_STORAGE_FIXED_ROM                       0x0001
483 #define MTP_STORAGE_REMOVABLE_ROM                   0x0002
484 #define MTP_STORAGE_FIXED_RAM                       0x0003
485 #define MTP_STORAGE_REMOVABLE_RAM                   0x0004
486 
487 // Storage File System
488 #define MTP_STORAGE_FILESYSTEM_FLAT                 0x0001
489 #define MTP_STORAGE_FILESYSTEM_HIERARCHICAL         0x0002
490 #define MTP_STORAGE_FILESYSTEM_DCF                  0x0003
491 
492 // Storage Access Capability
493 #define MTP_STORAGE_READ_WRITE                      0x0000
494 #define MTP_STORAGE_READ_ONLY_WITHOUT_DELETE        0x0001
495 #define MTP_STORAGE_READ_ONLY_WITH_DELETE           0x0002
496 
497 // Association Type
498 #define MTP_ASSOCIATION_TYPE_UNDEFINED              0x0000
499 #define MTP_ASSOCIATION_TYPE_GENERIC_FOLDER         0x0001
500 
501 // MTP class reqeusts
502 #define MTP_REQUEST_CANCEL              0x64
503 #define MTP_REQUEST_GET_EXT_EVENT_DATA  0x65
504 #define MTP_REQUEST_RESET               0x66
505 #define MTP_REQUEST_GET_DEVICE_STATUS   0x67
506 // clang-format on
507 
508 #define USB_MTP_CLASS 0x06
509 
510 #define USB_MTP_SUB_CLASS 0x01U
511 #define USB_MTP_PROTOCOL  0x01U
512 
513 struct mtp_header {
514     uint32_t conlen;
515     uint16_t contype;
516     uint16_t code;
517     uint32_t trans_id;
518     uint32_t param[];
519 };
520 
521 struct mtp_string {
522     uint8_t len;
523     uint16_t string[255];
524 };
525 
526 struct mtp_device_info {
527     uint16_t StandardVersion;
528     uint32_t VendorExtensionID;
529     uint16_t VendorExtensionVersion;
530     uint8_t VendorExtensionDesc_len;
531     uint16_t VendorExtensionDesc[255];
532     uint16_t FunctionalMode;
533     uint32_t OperationsSupported_len;
534     uint16_t OperationsSupported[255];
535     uint32_t EventsSupported_len;
536     uint16_t EventsSupported[255];
537     uint32_t DevicePropertiesSupported_len;
538     uint16_t DevicePropertiesSupported[255];
539     uint32_t CaptureFormats_len;
540     uint16_t CaptureFormats[255];
541     uint32_t ImageFormats_len;
542     uint16_t ImageFormats[255];
543     uint8_t Manufacturer_len;
544     uint16_t Manufacturer[255];
545     uint8_t Model_len;
546     uint16_t Model[255];
547     uint8_t DeviceVersion_len;
548     uint16_t DeviceVersion[255];
549     uint8_t SerialNumber_len;
550     uint16_t SerialNumber[255];
551 } __PACKED;
552 
553 struct mtp_object_props_support {
554     uint32_t ObjectPropCode_len;
555     uint16_t ObjectPropCode[255];
556 } __PACKED;
557 
558 struct mtp_device_prop_desc {
559     uint16_t DevicePropertyCode;
560     uint16_t DataType;
561     uint8_t GetSet;
562     uint16_t DefaultValue[1];
563     uint16_t CurrentValue[1];
564     uint8_t FormFlag;
565 } __PACKED;
566 
567 struct mtp_storage_id {
568     uint32_t StorageIDS_len;
569     uint32_t StorageIDS[255];
570 } __PACKED;
571 
572 struct mtp_storage_info {
573     uint16_t StorageType;
574     uint16_t FilesystemType;
575     uint16_t AccessCapability;
576     uint64_t MaxCapability;
577     uint64_t FreeSpaceInBytes;
578     uint32_t FreeSpaceInObjects;
579     uint8_t StorageDescription_len;
580     uint8_t StorageDescription[255];
581     uint8_t VolumeIdentifier_len;
582     uint8_t VolumeIdentifier[255];
583 } __PACKED;
584 
585 struct mtp_object_handles {
586     uint32_t ObjectHandle_len;
587     uint32_t ObjectHandle[255];
588 } __PACKED;
589 
590 struct mtp_object_prop_desc {
591     uint16_t ObjectPropertyCode;
592     uint16_t DataType;
593     uint8_t GetSet;
594     uint8_t DefValue[16];
595     uint32_t GroupCode;
596     uint8_t FormFlag;
597 } __PACKED;
598 
599 struct mtp_object_prop_element {
600     uint32_t ObjectHandle;
601     uint16_t PropertyCode;
602     uint16_t Datatype;
603     uint8_t value[8];
604 } __PACKED;
605 
606 struct mtp_object_prop_list {
607     uint32_t element_len;
608     struct mtp_object_prop_element element[1];
609 } __PACKED;
610 
611 struct mtp_object_info {
612     uint32_t StorageId;
613     uint16_t ObjectFormat;
614     uint16_t ProtectionStatus;
615     uint32_t ObjectCompressedSize;
616     uint16_t ThumbFormat;
617     uint32_t ThumbCompressedSize;
618     uint32_t ThumbPixWidth;
619     uint32_t ThumbPixHeight;
620     uint32_t ImagePixWidth;
621     uint32_t ImagePixHeight;
622     uint32_t ImageBitDepth;
623     uint32_t ParentObject;
624     uint16_t AssociationType;
625     uint32_t AssociationDesc;
626     uint32_t SequenceNumber;
627     uint8_t Filename_len;
628     uint16_t Filename[CONFIG_USBDEV_MTP_MAX_PATHNAME];
629     uint8_t CaptureDate[6];
630     uint8_t ModificationDate[6];
631 } __PACKED;
632 
633 struct mtp_object {
634     uint32_t storage_id;
635     uint32_t handle;
636     uint32_t parent_handle;
637     uint16_t format;
638     bool is_dir;
639     bool is_readonly;
640     bool is_hidden;
641     uint32_t file_size;
642     uint32_t file_full_name_length;
643     char file_full_name[CONFIG_USBDEV_MTP_MAX_PATHNAME];
644     bool in_use;
645 };
646 
647 /*Length of template descriptor: 30 bytes*/
648 #define MTP_DESCRIPTOR_LEN (9 + 7 + 7 + 7)
649 
650 // clang-format off
651 #define MTP_DESCRIPTOR_INIT(bFirstInterface, out_ep, in_ep, int_ep, wMaxPacketSize, str_idx) \
652     /* Interface */                                                      \
653     0x09,                          /* bLength */                         \
654     USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */                 \
655     bFirstInterface,               /* bInterfaceNumber */                \
656     0x00,                          /* bAlternateSetting */               \
657     0x03,                          /* bNumEndpoints */                   \
658     USB_DEVICE_CLASS_IMAGE,        /* bInterfaceClass */                 \
659     USB_MTP_SUB_CLASS,             /* bInterfaceSubClass */              \
660     USB_MTP_PROTOCOL,              /* bInterfaceProtocol */              \
661     str_idx,                       /* iInterface */                      \
662     0x07,                          /* bLength */                         \
663     USB_DESCRIPTOR_TYPE_ENDPOINT,  /* bDescriptorType */                 \
664     out_ep,                        /* bEndpointAddress */                \
665     0x02,                          /* bmAttributes */                    \
666     WBVAL(wMaxPacketSize),         /* wMaxPacketSize */                  \
667     0x00,                          /* bInterval */                       \
668     0x07,                          /* bLength */                         \
669     USB_DESCRIPTOR_TYPE_ENDPOINT,  /* bDescriptorType */                 \
670     in_ep,                         /* bEndpointAddress */                \
671     0x02,                          /* bmAttributes */                    \
672     WBVAL(wMaxPacketSize),         /* wMaxPacketSize */                  \
673     0x00,                          /* bInterval */                       \
674     0x07,                          /* bLength */                         \
675     USB_DESCRIPTOR_TYPE_ENDPOINT,  /* bDescriptorType */                 \
676     int_ep,                        /* bEndpointAddress */                \
677     0x03,                          /* bmAttributes */                    \
678     WBVAL(0x1c),                   /* wMaxPacketSize */                  \
679     0x06                           /* bInterval */
680 // clang-format on
681 
682 #endif