xref: /aosp_15_r20/frameworks/av/media/mtp/MtpDescriptors.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #include <android-base/logging.h>
18*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h>
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include "MtpDescriptors.h"
21*ec779b8eSAndroid Build Coastguard Worker 
22*ec779b8eSAndroid Build Coastguard Worker namespace android {
23*ec779b8eSAndroid Build Coastguard Worker 
24*ec779b8eSAndroid Build Coastguard Worker const struct usb_interface_descriptor mtp_interface_desc = {
25*ec779b8eSAndroid Build Coastguard Worker     .bLength = USB_DT_INTERFACE_SIZE,
26*ec779b8eSAndroid Build Coastguard Worker     .bDescriptorType = USB_DT_INTERFACE,
27*ec779b8eSAndroid Build Coastguard Worker     .bInterfaceNumber = 0,
28*ec779b8eSAndroid Build Coastguard Worker     .bNumEndpoints = 3,
29*ec779b8eSAndroid Build Coastguard Worker     .bInterfaceClass = USB_CLASS_STILL_IMAGE,
30*ec779b8eSAndroid Build Coastguard Worker     .bInterfaceSubClass = 1,
31*ec779b8eSAndroid Build Coastguard Worker     .bInterfaceProtocol = 1,
32*ec779b8eSAndroid Build Coastguard Worker     .iInterface = 1,
33*ec779b8eSAndroid Build Coastguard Worker };
34*ec779b8eSAndroid Build Coastguard Worker 
35*ec779b8eSAndroid Build Coastguard Worker const struct usb_interface_descriptor ptp_interface_desc = {
36*ec779b8eSAndroid Build Coastguard Worker     .bLength = USB_DT_INTERFACE_SIZE,
37*ec779b8eSAndroid Build Coastguard Worker     .bDescriptorType = USB_DT_INTERFACE,
38*ec779b8eSAndroid Build Coastguard Worker     .bInterfaceNumber = 0,
39*ec779b8eSAndroid Build Coastguard Worker     .bNumEndpoints = 3,
40*ec779b8eSAndroid Build Coastguard Worker     .bInterfaceClass = USB_CLASS_STILL_IMAGE,
41*ec779b8eSAndroid Build Coastguard Worker     .bInterfaceSubClass = 1,
42*ec779b8eSAndroid Build Coastguard Worker     .bInterfaceProtocol = 1,
43*ec779b8eSAndroid Build Coastguard Worker };
44*ec779b8eSAndroid Build Coastguard Worker 
45*ec779b8eSAndroid Build Coastguard Worker const struct usb_endpoint_descriptor_no_audio fs_sink = {
46*ec779b8eSAndroid Build Coastguard Worker     .bLength = USB_DT_ENDPOINT_SIZE,
47*ec779b8eSAndroid Build Coastguard Worker     .bDescriptorType = USB_DT_ENDPOINT,
48*ec779b8eSAndroid Build Coastguard Worker     .bEndpointAddress = 1 | USB_DIR_IN,
49*ec779b8eSAndroid Build Coastguard Worker     .bmAttributes = USB_ENDPOINT_XFER_BULK,
50*ec779b8eSAndroid Build Coastguard Worker     .wMaxPacketSize = MAX_PACKET_SIZE_FS,
51*ec779b8eSAndroid Build Coastguard Worker };
52*ec779b8eSAndroid Build Coastguard Worker 
53*ec779b8eSAndroid Build Coastguard Worker const struct usb_endpoint_descriptor_no_audio fs_source = {
54*ec779b8eSAndroid Build Coastguard Worker     .bLength = USB_DT_ENDPOINT_SIZE,
55*ec779b8eSAndroid Build Coastguard Worker     .bDescriptorType = USB_DT_ENDPOINT,
56*ec779b8eSAndroid Build Coastguard Worker     .bEndpointAddress = 2 | USB_DIR_OUT,
57*ec779b8eSAndroid Build Coastguard Worker     .bmAttributes = USB_ENDPOINT_XFER_BULK,
58*ec779b8eSAndroid Build Coastguard Worker     .wMaxPacketSize = MAX_PACKET_SIZE_FS,
59*ec779b8eSAndroid Build Coastguard Worker };
60*ec779b8eSAndroid Build Coastguard Worker 
61*ec779b8eSAndroid Build Coastguard Worker const struct usb_endpoint_descriptor_no_audio intr = {
62*ec779b8eSAndroid Build Coastguard Worker     .bLength = USB_DT_ENDPOINT_SIZE,
63*ec779b8eSAndroid Build Coastguard Worker     .bDescriptorType = USB_DT_ENDPOINT,
64*ec779b8eSAndroid Build Coastguard Worker     .bEndpointAddress = 3 | USB_DIR_IN,
65*ec779b8eSAndroid Build Coastguard Worker     .bmAttributes = USB_ENDPOINT_XFER_INT,
66*ec779b8eSAndroid Build Coastguard Worker     .wMaxPacketSize = MAX_PACKET_SIZE_EV,
67*ec779b8eSAndroid Build Coastguard Worker     .bInterval = 6,
68*ec779b8eSAndroid Build Coastguard Worker };
69*ec779b8eSAndroid Build Coastguard Worker 
70*ec779b8eSAndroid Build Coastguard Worker const struct usb_endpoint_descriptor_no_audio hs_sink = {
71*ec779b8eSAndroid Build Coastguard Worker     .bLength = USB_DT_ENDPOINT_SIZE,
72*ec779b8eSAndroid Build Coastguard Worker     .bDescriptorType = USB_DT_ENDPOINT,
73*ec779b8eSAndroid Build Coastguard Worker     .bEndpointAddress = 1 | USB_DIR_IN,
74*ec779b8eSAndroid Build Coastguard Worker     .bmAttributes = USB_ENDPOINT_XFER_BULK,
75*ec779b8eSAndroid Build Coastguard Worker     .wMaxPacketSize = MAX_PACKET_SIZE_HS,
76*ec779b8eSAndroid Build Coastguard Worker };
77*ec779b8eSAndroid Build Coastguard Worker 
78*ec779b8eSAndroid Build Coastguard Worker const struct usb_endpoint_descriptor_no_audio hs_source = {
79*ec779b8eSAndroid Build Coastguard Worker     .bLength = USB_DT_ENDPOINT_SIZE,
80*ec779b8eSAndroid Build Coastguard Worker     .bDescriptorType = USB_DT_ENDPOINT,
81*ec779b8eSAndroid Build Coastguard Worker     .bEndpointAddress = 2 | USB_DIR_OUT,
82*ec779b8eSAndroid Build Coastguard Worker     .bmAttributes = USB_ENDPOINT_XFER_BULK,
83*ec779b8eSAndroid Build Coastguard Worker     .wMaxPacketSize = MAX_PACKET_SIZE_HS,
84*ec779b8eSAndroid Build Coastguard Worker };
85*ec779b8eSAndroid Build Coastguard Worker 
86*ec779b8eSAndroid Build Coastguard Worker const struct usb_endpoint_descriptor_no_audio ss_sink = {
87*ec779b8eSAndroid Build Coastguard Worker     .bLength = USB_DT_ENDPOINT_SIZE,
88*ec779b8eSAndroid Build Coastguard Worker     .bDescriptorType = USB_DT_ENDPOINT,
89*ec779b8eSAndroid Build Coastguard Worker     .bEndpointAddress = 1 | USB_DIR_IN,
90*ec779b8eSAndroid Build Coastguard Worker     .bmAttributes = USB_ENDPOINT_XFER_BULK,
91*ec779b8eSAndroid Build Coastguard Worker     .wMaxPacketSize = MAX_PACKET_SIZE_SS,
92*ec779b8eSAndroid Build Coastguard Worker };
93*ec779b8eSAndroid Build Coastguard Worker 
94*ec779b8eSAndroid Build Coastguard Worker const struct usb_endpoint_descriptor_no_audio ss_source = {
95*ec779b8eSAndroid Build Coastguard Worker     .bLength = USB_DT_ENDPOINT_SIZE,
96*ec779b8eSAndroid Build Coastguard Worker     .bDescriptorType = USB_DT_ENDPOINT,
97*ec779b8eSAndroid Build Coastguard Worker     .bEndpointAddress = 2 | USB_DIR_OUT,
98*ec779b8eSAndroid Build Coastguard Worker     .bmAttributes = USB_ENDPOINT_XFER_BULK,
99*ec779b8eSAndroid Build Coastguard Worker     .wMaxPacketSize = MAX_PACKET_SIZE_SS,
100*ec779b8eSAndroid Build Coastguard Worker };
101*ec779b8eSAndroid Build Coastguard Worker 
102*ec779b8eSAndroid Build Coastguard Worker const struct usb_ss_ep_comp_descriptor ss_sink_comp = {
103*ec779b8eSAndroid Build Coastguard Worker     .bLength = sizeof(ss_sink_comp),
104*ec779b8eSAndroid Build Coastguard Worker     .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
105*ec779b8eSAndroid Build Coastguard Worker     .bMaxBurst = 6,
106*ec779b8eSAndroid Build Coastguard Worker };
107*ec779b8eSAndroid Build Coastguard Worker 
108*ec779b8eSAndroid Build Coastguard Worker const struct usb_ss_ep_comp_descriptor ss_source_comp = {
109*ec779b8eSAndroid Build Coastguard Worker     .bLength = sizeof(ss_source_comp),
110*ec779b8eSAndroid Build Coastguard Worker     .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
111*ec779b8eSAndroid Build Coastguard Worker     .bMaxBurst = 6,
112*ec779b8eSAndroid Build Coastguard Worker };
113*ec779b8eSAndroid Build Coastguard Worker 
114*ec779b8eSAndroid Build Coastguard Worker const struct usb_ss_ep_comp_descriptor ss_intr_comp = {
115*ec779b8eSAndroid Build Coastguard Worker     .bLength = sizeof(ss_intr_comp),
116*ec779b8eSAndroid Build Coastguard Worker     .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
117*ec779b8eSAndroid Build Coastguard Worker };
118*ec779b8eSAndroid Build Coastguard Worker 
119*ec779b8eSAndroid Build Coastguard Worker const struct func_desc mtp_fs_descriptors = {
120*ec779b8eSAndroid Build Coastguard Worker     .intf = mtp_interface_desc,
121*ec779b8eSAndroid Build Coastguard Worker     .sink = fs_sink,
122*ec779b8eSAndroid Build Coastguard Worker     .source = fs_source,
123*ec779b8eSAndroid Build Coastguard Worker     .intr = intr,
124*ec779b8eSAndroid Build Coastguard Worker };
125*ec779b8eSAndroid Build Coastguard Worker 
126*ec779b8eSAndroid Build Coastguard Worker const struct func_desc mtp_hs_descriptors = {
127*ec779b8eSAndroid Build Coastguard Worker     .intf = mtp_interface_desc,
128*ec779b8eSAndroid Build Coastguard Worker     .sink = hs_sink,
129*ec779b8eSAndroid Build Coastguard Worker     .source = hs_source,
130*ec779b8eSAndroid Build Coastguard Worker     .intr = intr,
131*ec779b8eSAndroid Build Coastguard Worker };
132*ec779b8eSAndroid Build Coastguard Worker 
133*ec779b8eSAndroid Build Coastguard Worker const struct ss_func_desc mtp_ss_descriptors = {
134*ec779b8eSAndroid Build Coastguard Worker     .intf = mtp_interface_desc,
135*ec779b8eSAndroid Build Coastguard Worker     .sink = ss_sink,
136*ec779b8eSAndroid Build Coastguard Worker     .sink_comp = ss_sink_comp,
137*ec779b8eSAndroid Build Coastguard Worker     .source = ss_source,
138*ec779b8eSAndroid Build Coastguard Worker     .source_comp = ss_source_comp,
139*ec779b8eSAndroid Build Coastguard Worker     .intr = intr,
140*ec779b8eSAndroid Build Coastguard Worker     .intr_comp = ss_intr_comp,
141*ec779b8eSAndroid Build Coastguard Worker };
142*ec779b8eSAndroid Build Coastguard Worker 
143*ec779b8eSAndroid Build Coastguard Worker const struct func_desc ptp_fs_descriptors = {
144*ec779b8eSAndroid Build Coastguard Worker     .intf = ptp_interface_desc,
145*ec779b8eSAndroid Build Coastguard Worker     .sink = fs_sink,
146*ec779b8eSAndroid Build Coastguard Worker     .source = fs_source,
147*ec779b8eSAndroid Build Coastguard Worker     .intr = intr,
148*ec779b8eSAndroid Build Coastguard Worker };
149*ec779b8eSAndroid Build Coastguard Worker 
150*ec779b8eSAndroid Build Coastguard Worker const struct func_desc ptp_hs_descriptors = {
151*ec779b8eSAndroid Build Coastguard Worker     .intf = ptp_interface_desc,
152*ec779b8eSAndroid Build Coastguard Worker     .sink = hs_sink,
153*ec779b8eSAndroid Build Coastguard Worker     .source = hs_source,
154*ec779b8eSAndroid Build Coastguard Worker     .intr = intr,
155*ec779b8eSAndroid Build Coastguard Worker };
156*ec779b8eSAndroid Build Coastguard Worker 
157*ec779b8eSAndroid Build Coastguard Worker const struct ss_func_desc ptp_ss_descriptors = {
158*ec779b8eSAndroid Build Coastguard Worker     .intf = ptp_interface_desc,
159*ec779b8eSAndroid Build Coastguard Worker     .sink = ss_sink,
160*ec779b8eSAndroid Build Coastguard Worker     .sink_comp = ss_sink_comp,
161*ec779b8eSAndroid Build Coastguard Worker     .source = ss_source,
162*ec779b8eSAndroid Build Coastguard Worker     .source_comp = ss_source_comp,
163*ec779b8eSAndroid Build Coastguard Worker     .intr = intr,
164*ec779b8eSAndroid Build Coastguard Worker     .intr_comp = ss_intr_comp,
165*ec779b8eSAndroid Build Coastguard Worker };
166*ec779b8eSAndroid Build Coastguard Worker 
167*ec779b8eSAndroid Build Coastguard Worker const struct functionfs_strings mtp_strings = {
168*ec779b8eSAndroid Build Coastguard Worker     .header = {
169*ec779b8eSAndroid Build Coastguard Worker         .magic = htole32(FUNCTIONFS_STRINGS_MAGIC),
170*ec779b8eSAndroid Build Coastguard Worker         .length = htole32(sizeof(mtp_strings)),
171*ec779b8eSAndroid Build Coastguard Worker         .str_count = htole32(1),
172*ec779b8eSAndroid Build Coastguard Worker         .lang_count = htole32(1),
173*ec779b8eSAndroid Build Coastguard Worker     },
174*ec779b8eSAndroid Build Coastguard Worker     .lang0 = {
175*ec779b8eSAndroid Build Coastguard Worker         .code = htole16(0x0409),
176*ec779b8eSAndroid Build Coastguard Worker         .str1 = STR_INTERFACE,
177*ec779b8eSAndroid Build Coastguard Worker     },
178*ec779b8eSAndroid Build Coastguard Worker };
179*ec779b8eSAndroid Build Coastguard Worker 
180*ec779b8eSAndroid Build Coastguard Worker const struct usb_os_desc_header mtp_os_desc_header = {
181*ec779b8eSAndroid Build Coastguard Worker     .interface = htole32(1),
182*ec779b8eSAndroid Build Coastguard Worker     .dwLength = htole32(sizeof(usb_os_desc_header) + sizeof(usb_ext_compat_desc)),
183*ec779b8eSAndroid Build Coastguard Worker     .bcdVersion = htole16(1),
184*ec779b8eSAndroid Build Coastguard Worker     .wIndex = htole16(4),
185*ec779b8eSAndroid Build Coastguard Worker     .bCount = htole16(1),
186*ec779b8eSAndroid Build Coastguard Worker     .Reserved = htole16(0),
187*ec779b8eSAndroid Build Coastguard Worker };
188*ec779b8eSAndroid Build Coastguard Worker 
189*ec779b8eSAndroid Build Coastguard Worker const struct usb_ext_compat_desc mtp_os_desc_compat = {
190*ec779b8eSAndroid Build Coastguard Worker     .bFirstInterfaceNumber = 0,
191*ec779b8eSAndroid Build Coastguard Worker     .Reserved1 = htole32(1),
192*ec779b8eSAndroid Build Coastguard Worker     .CompatibleID = { 'M', 'T', 'P' },
193*ec779b8eSAndroid Build Coastguard Worker     .SubCompatibleID = {0},
194*ec779b8eSAndroid Build Coastguard Worker     .Reserved2 = {0},
195*ec779b8eSAndroid Build Coastguard Worker };
196*ec779b8eSAndroid Build Coastguard Worker 
197*ec779b8eSAndroid Build Coastguard Worker const struct usb_ext_compat_desc ptp_os_desc_compat = {
198*ec779b8eSAndroid Build Coastguard Worker     .bFirstInterfaceNumber = 0,
199*ec779b8eSAndroid Build Coastguard Worker     .Reserved1 = htole32(1),
200*ec779b8eSAndroid Build Coastguard Worker     .CompatibleID = { 'P', 'T', 'P' },
201*ec779b8eSAndroid Build Coastguard Worker     .SubCompatibleID = {0},
202*ec779b8eSAndroid Build Coastguard Worker     .Reserved2 = {0},
203*ec779b8eSAndroid Build Coastguard Worker };
204*ec779b8eSAndroid Build Coastguard Worker 
205*ec779b8eSAndroid Build Coastguard Worker const struct desc_v2 mtp_desc_v2 = {
206*ec779b8eSAndroid Build Coastguard Worker     .header = {
207*ec779b8eSAndroid Build Coastguard Worker         .magic = htole32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2),
208*ec779b8eSAndroid Build Coastguard Worker         .length = htole32(sizeof(struct desc_v2)),
209*ec779b8eSAndroid Build Coastguard Worker         .flags = FUNCTIONFS_HAS_FS_DESC | FUNCTIONFS_HAS_HS_DESC |
210*ec779b8eSAndroid Build Coastguard Worker                  FUNCTIONFS_HAS_SS_DESC | FUNCTIONFS_HAS_MS_OS_DESC,
211*ec779b8eSAndroid Build Coastguard Worker     },
212*ec779b8eSAndroid Build Coastguard Worker     .fs_count = 4,
213*ec779b8eSAndroid Build Coastguard Worker     .hs_count = 4,
214*ec779b8eSAndroid Build Coastguard Worker     .ss_count = 7,
215*ec779b8eSAndroid Build Coastguard Worker     .os_count = 1,
216*ec779b8eSAndroid Build Coastguard Worker     .fs_descs = mtp_fs_descriptors,
217*ec779b8eSAndroid Build Coastguard Worker     .hs_descs = mtp_hs_descriptors,
218*ec779b8eSAndroid Build Coastguard Worker     .ss_descs = mtp_ss_descriptors,
219*ec779b8eSAndroid Build Coastguard Worker     .os_header = mtp_os_desc_header,
220*ec779b8eSAndroid Build Coastguard Worker     .os_desc = mtp_os_desc_compat,
221*ec779b8eSAndroid Build Coastguard Worker };
222*ec779b8eSAndroid Build Coastguard Worker 
223*ec779b8eSAndroid Build Coastguard Worker const struct desc_v2 ptp_desc_v2 = {
224*ec779b8eSAndroid Build Coastguard Worker     .header = {
225*ec779b8eSAndroid Build Coastguard Worker         .magic = htole32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2),
226*ec779b8eSAndroid Build Coastguard Worker         .length = htole32(sizeof(struct desc_v2)),
227*ec779b8eSAndroid Build Coastguard Worker         .flags = FUNCTIONFS_HAS_FS_DESC | FUNCTIONFS_HAS_HS_DESC |
228*ec779b8eSAndroid Build Coastguard Worker                  FUNCTIONFS_HAS_SS_DESC | FUNCTIONFS_HAS_MS_OS_DESC,
229*ec779b8eSAndroid Build Coastguard Worker     },
230*ec779b8eSAndroid Build Coastguard Worker     .fs_count = 4,
231*ec779b8eSAndroid Build Coastguard Worker     .hs_count = 4,
232*ec779b8eSAndroid Build Coastguard Worker     .ss_count = 7,
233*ec779b8eSAndroid Build Coastguard Worker     .os_count = 1,
234*ec779b8eSAndroid Build Coastguard Worker     .fs_descs = ptp_fs_descriptors,
235*ec779b8eSAndroid Build Coastguard Worker     .hs_descs = ptp_hs_descriptors,
236*ec779b8eSAndroid Build Coastguard Worker     .ss_descs = ptp_ss_descriptors,
237*ec779b8eSAndroid Build Coastguard Worker     .os_header = mtp_os_desc_header,
238*ec779b8eSAndroid Build Coastguard Worker     .os_desc = ptp_os_desc_compat,
239*ec779b8eSAndroid Build Coastguard Worker };
240*ec779b8eSAndroid Build Coastguard Worker 
241*ec779b8eSAndroid Build Coastguard Worker const struct desc_v1 mtp_desc_v1 = {
242*ec779b8eSAndroid Build Coastguard Worker     .header = {
243*ec779b8eSAndroid Build Coastguard Worker         .magic = htole32(FUNCTIONFS_DESCRIPTORS_MAGIC),
244*ec779b8eSAndroid Build Coastguard Worker         .length = htole32(sizeof(struct desc_v1)),
245*ec779b8eSAndroid Build Coastguard Worker         .fs_count = 4,
246*ec779b8eSAndroid Build Coastguard Worker         .hs_count = 4,
247*ec779b8eSAndroid Build Coastguard Worker     },
248*ec779b8eSAndroid Build Coastguard Worker     .fs_descs = mtp_fs_descriptors,
249*ec779b8eSAndroid Build Coastguard Worker     .hs_descs = mtp_hs_descriptors,
250*ec779b8eSAndroid Build Coastguard Worker };
251*ec779b8eSAndroid Build Coastguard Worker 
252*ec779b8eSAndroid Build Coastguard Worker const struct desc_v1 ptp_desc_v1 = {
253*ec779b8eSAndroid Build Coastguard Worker     .header = {
254*ec779b8eSAndroid Build Coastguard Worker         .magic = htole32(FUNCTIONFS_DESCRIPTORS_MAGIC),
255*ec779b8eSAndroid Build Coastguard Worker         .length = htole32(sizeof(struct desc_v1)),
256*ec779b8eSAndroid Build Coastguard Worker         .fs_count = 4,
257*ec779b8eSAndroid Build Coastguard Worker         .hs_count = 4,
258*ec779b8eSAndroid Build Coastguard Worker     },
259*ec779b8eSAndroid Build Coastguard Worker     .fs_descs = ptp_fs_descriptors,
260*ec779b8eSAndroid Build Coastguard Worker     .hs_descs = ptp_hs_descriptors,
261*ec779b8eSAndroid Build Coastguard Worker };
262*ec779b8eSAndroid Build Coastguard Worker 
writeDescriptors(int fd,bool ptp)263*ec779b8eSAndroid Build Coastguard Worker bool writeDescriptors(int fd, bool ptp) {
264*ec779b8eSAndroid Build Coastguard Worker     ssize_t ret = TEMP_FAILURE_RETRY(write(fd,
265*ec779b8eSAndroid Build Coastguard Worker                 &(ptp ? ptp_desc_v2 : mtp_desc_v2), sizeof(desc_v2)));
266*ec779b8eSAndroid Build Coastguard Worker     if (ret < 0) {
267*ec779b8eSAndroid Build Coastguard Worker         PLOG(ERROR) << fd << "Switching to V1 descriptor format";
268*ec779b8eSAndroid Build Coastguard Worker         ret = TEMP_FAILURE_RETRY(write(fd,
269*ec779b8eSAndroid Build Coastguard Worker                     &(ptp ? ptp_desc_v1 : mtp_desc_v1), sizeof(desc_v1)));
270*ec779b8eSAndroid Build Coastguard Worker         if (ret < 0) {
271*ec779b8eSAndroid Build Coastguard Worker             PLOG(ERROR) << fd << "Writing descriptors failed";
272*ec779b8eSAndroid Build Coastguard Worker             return false;
273*ec779b8eSAndroid Build Coastguard Worker         }
274*ec779b8eSAndroid Build Coastguard Worker     }
275*ec779b8eSAndroid Build Coastguard Worker     ret = TEMP_FAILURE_RETRY(write(fd, &mtp_strings, sizeof(mtp_strings)));
276*ec779b8eSAndroid Build Coastguard Worker     if (ret < 0) {
277*ec779b8eSAndroid Build Coastguard Worker         PLOG(ERROR) << fd << "Writing strings failed";
278*ec779b8eSAndroid Build Coastguard Worker         return false;
279*ec779b8eSAndroid Build Coastguard Worker     }
280*ec779b8eSAndroid Build Coastguard Worker     return true;
281*ec779b8eSAndroid Build Coastguard Worker }
282*ec779b8eSAndroid Build Coastguard Worker 
283*ec779b8eSAndroid Build Coastguard Worker }; // namespace android
284